我喜欢在Golang中使用JSON,特别是弹性搜索JSON协议。
JSON是深层嵌套的(这是一个简单的查询):
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"and": [
{
"range" : {
"b" : {
"from" : 4,
"to" : "8"
}
},
},
{
"term": {
"a": "john"
}
}
]
}
}
}
}
此结构可轻松映射到Ruby中的本机数据结构。
但是对于Golang,似乎你必须使用结构定义确切的结构(可能是从JSON源以编程方式生成它们)。
即便如此,诸如不同类型的阵列之类的东西也是如此。 JS中的对象需要解决方法和自定义代码。例如"和"示例JSON中的键。 (http://mattyjwilliams.blogspot.co.uk/2013/01/using-go-to-unmarshal-json-lists-with.html)。
在Golang中使用JSON有更好的方法吗?
答案 0 :(得分:3)
如果您选择结构路线,请考虑以下示例:
{"data": {"children": [
{"data": {
"title": "The Go homepage",
"url": "http://golang.org/"
}},
...
]}}
// -----------
type Item struct {
Title string
URL string
}
type Response struct {
Data struct {
Children []struct {
Data Item
}
}
}
答案 1 :(得分:2)
其中一个选项是使用gabs库:https://github.com/Jeffail/gabs
它可用于解析和生成复杂的json结构。
这是自述文件中嵌套json生成的示例:
jsonObj := gabs.New()
// or gabs.Consume(jsonObject) to work on an existing map[string]interface{}
jsonObj.Set(10, "outter", "inner", "value")
jsonObj.SetP(20, "outter.inner.value2")
jsonObj.Set(30, "outter", "inner2", "value3")
将打印:
{"outter":{"inner":{"value":10,"value2":20},"inner2":{"value3":30}}}
答案 2 :(得分:0)
答案 3 :(得分:0)
根据本文https://medium.com/@xcoulon/nested-structs-in-golang-2c750403a007,您应该为每个字段定义json标签,然后您就可以使用嵌套的struct
下面是示例,您可以将其粘贴到操场上进行测试。
brew install
答案 4 :(得分:0)
如果您愿意,使用 struct
是最好的选择。一项
可以提供帮助,如果您只使用一次结构,则可以在
同时声明它,而不是使用 type
关键字。另一个项目,
是你只需要定义你实际使用的字段,其他的你可以省略。
最后,只要你可以不区分大小写匹配源字段名称,那么
您无需担心 struct
标签:
package main
import "encoding/json"
const s = `
{
"query": {
"filtered": {
"query": {"match_all": {}},
"filter": {
"and": [
{"range" : {"b" : {"from": 4, "to": "8"}}},
{"term": {"a": "john"}}
]
}
}
}
}
`
func main() {
var m struct {
Query struct {
Filtered struct {
Filter struct { And []struct { Term struct { A string } } }
}
}
}
json.Unmarshal([]byte(s), &m)
println(m.Query.Filtered.Filter.And[1].Term.A == "john")
}