How to parse JSON array in Go

偶尔善良 提交于 2021-02-04 09:01:27

问题


How to parse a string (which is an array) in Go using json package?

type JsonType struct{
    Array []string
}

func main(){
    dataJson = `["1","2","3"]`
    arr := JsonType{}
    unmarshaled := json.Unmarshal([]byte(dataJson), &arr.Array)
    log.Printf("Unmarshaled: %v", unmarshaled)
}

回答1:


The return value of Unmarshal is an err, and this is what you are printing out:

// Return value type of Unmarshal is error.
err := json.Unmarshal([]byte(dataJson), &arr)

You can get rid of the JsonType as well and just use a slice:

package main

import (
    "encoding/json"
    "log"
)

func main() {
    dataJson := `["1","2","3"]`
    var arr []string
    _ = json.Unmarshal([]byte(dataJson), &arr)
    log.Printf("Unmarshaled: %v", arr)
}

// prints out:
// 2009/11/10 23:00:00 Unmarshaled: [1 2 3]

Code on play: https://play.golang.org/p/GNWlylavam




回答2:


Note: This answer was written before the question was edited. In the original question &arr was passed to json.Unmarshal():

unmarshaled := json.Unmarshal([]byte(dataJson), &arr)

You pass the address of arr to json.Unmarshal() to unmarshal a JSON array, but arr is not an array (or slice), it is a struct value.

Arrays can be unmarshaled into Go arrays or slices. So pass arr.Array:

dataJson := `["1","2","3"]`
arr := JsonType{}
err := json.Unmarshal([]byte(dataJson), &arr.Array)
log.Printf("Unmarshaled: %v, error: %v", arr.Array, err)

Output (try it on the Go Playground):

2009/11/10 23:00:00 Unmarshaled: [1 2 3], error: <nil>

Of course you don't even need the JsonType wrapper, just use a simple []string slice:

dataJson := `["1","2","3"]`
var s []string
err := json.Unmarshal([]byte(dataJson), &s)


来源:https://stackoverflow.com/questions/38867692/how-to-parse-json-array-in-go

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!