如何在 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)
【讨论】:
忘记传地址了,还以为是返回了解析后的数组,所以结果为什么是json
包可以直接解组到您的变量中。结果不需要返回,但可选的错误必须是。
所以我的问题是我打印出错误的值而不是 arr.Array 的指向值,这对我来说很困惑,谢谢。
@kingSlayer 是的,您编辑了您的问题,但在您的original question 中您传递了arr
,这会导致错误。以上是关于如何在 Go 中解析 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章
Go 语言入门很简单 -- Go 语言解析JSON #私藏项目实操分享#