如何在 Golang 中解析 JSON 数组?

一个简单的问题:如何使用json包解析Go中的字符串(这是一个数组)?

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)
}

2个回答

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

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)
dongxing8766
dongxing8766 是的,您编辑了问题,但是在您的原始问题中,您通过了arr并导致错误。
大约 4 年之前 回复
dty9731
dty9731 所以我的问题是我打印出error的值而不是arr.Array的指针值,这对我来说是个困惑,谢谢。
大约 4 年之前 回复
dongshao9106
dongshao9106 您必须传递变量的地址,以便json包可以将其解组到您的变量中。 结果不需要返回,但是必须是可选错误。
大约 4 年之前 回复
duanji2002
duanji2002 我忘记了传递地址,并以为它返回了已解析的数组,所以为什么结果为<nil>,因为它是错误的值,这让我感到羞耻。
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐