如何在 Go 中解析 JSON 数组

Posted

技术标签:

【中文标题】如何在 Go 中解析 JSON 数组【英文标题】:How to parse JSON array in Go 【发布时间】:2016-12-16 12:00:37 【问题描述】:

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

【问题讨论】:

【参考方案1】:

Unmarshal 的 return value 是 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 减少(或完全摆脱)内存分配。此外,在处理上下文中,调用者可能会重复使用相同的值来重复保存分配。

【讨论】:

【参考方案2】:

注意:此答案是在编辑问题之前编写的。在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)

【讨论】:

忘记传地址了,还以为是返回了解析后的数组,所以结果为什么是,因为是错误的值,真丢人。 @kingSlayer 您必须传递变量的地址,以便json 包可以直接解组到您的变量中。结果不需要返回,但可选的错误必须是。 所以我的问题是我打印出错误的值而不是 arr.Array 的指向值,这对我来说很困惑,谢谢。 @kingSlayer 是的,您编辑了您的问题,但在您的original question 中您传递了arr,这会导致错误。

以上是关于如何在 Go 中解析 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

Go 语言入门很简单 -- Go 语言解析JSON #私藏项目实操分享#

在 GO 中解析 json 对象数组

如何在 Go 中将 JSON 对象数组转换为具有默认值的结构数组?

如何在 jQuery 中解析 JSON 数组?

如何继续在颤振中接收 JSON 数组并解析它?

如何在PHP中解析json