在Golang中使用嵌套JSON结构的最佳方法是什么?

时间:2015-08-03 22:39:24

标签: json go

我喜欢在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有更好的方法吗?

5 个答案:

答案 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
        }
    }
}

来源:http://talks.golang.org/2012/10things.slide#4

答案 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)

对于native golang,使用map [string] interface {}或define struct。 对于另一种轻松访问json对象的方法,可以是JsonPathJason

答案 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")
}