如何在 Go 中解析 JSON 数组

How to parse JSON array in Go

如何使用 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)
}

注意:这个回答是在编辑问题之前写的。在 original question&arr 被传递给 json.Unmarshal():

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

您将 arr 的地址传递给 json.Unmarshal() 以解组一个 JSON 数组,但是 arr 不是数组(或切片),它是一个结构值。

数组可以解组为 Go 数组或切片。所以通过 arr.Array:

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

输出(在 Go Playground 上尝试):

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

当然你甚至不需要 JsonType 包装器,只需使用一个简单的 []string 切片:

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

return value of Unmarshal is an error,这就是你正在打印的内容:

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

您也可以去掉 JsonType,只使用切片:

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]

播放代码:https://play.golang.org/p/GNWlylavam

背景:传入一个指针允许Unmarshal减少(或完全摆脱)内存分配。此外,在处理上下文中,调用者可以重复使用相同的值 - 也可以节省分配。