猿问

我如何创建这个 JSON 对象?

{

  "query": {

    "query_string": {

      "query": "<query string>"

    }

  }

}

我使用的 API 要求我以这种格式发送我的查询。我一直在尝试找到一种使用地图来创建它的方法,但我不断收到错误消息,并且无法在线找到任何解决方案。


编辑:我找到了一种方法,有没有更好的方法?


    test := map[string]map[string]map[string]string {

        "query": map[string]map[string]string {

            "query_string": map[string]string{

                "query": query,

             },

        },

    }


拉莫斯之舞
浏览 163回答 3
3回答

缥缈止盈

在 Go 中,您可以解组为各种不同的结构。最模棱两可的是一个interface{}. 我建议不要这样做,因为您放弃了获得任何真正类型安全的机会。另一个极端是使用结构,对于您的示例 json,它们看起来像这样;type Wrapper struct {&nbsp; &nbsp; Query Query `json:"query"`}type Query struct {&nbsp; &nbsp; QueryString QueryString `json:"query_string"`}type QueryString struct {&nbsp; &nbsp; &nbsp;Query string `json:"query"`}中间的东西,给你的例子 json 将是一个map[string]map[string]map[string]. 如果您不知道如何使用该encoding/json软件包,请查看此处的示例。https://golang.org/pkg/encoding/json/#example_Unmarshal这非常简单,如果您在 a 中有输入[]byte,然后实例化您想要将其解组的类型,则可以调用json.Unmarhsal(jsonBytes, &ThingToUnmarshalInto)编辑:根据 hobbs 的评论,您似乎实际上是在尝试将该 json 发送到服务器。在这种情况下,请使用上面的结构。另一个答案中提供的示例演示了您需要的一切。一切都与我上面描述的几乎相同,除了您使用json.Marshal要转换为 json 字符串的实例进行调用,而不是将 json 字符串作为 a[]byte并将其传递给 unmarshal 以获取结构。我错误地认为你正在接收那个 json,而不是试图形成它。

交互式爱情

下面是一个使用 map 方式和 struct 方式的Play示例。如您所见,如果您需要像这样发送一个请求,地图表单的代码通常更少,而且更清晰。如果您的请求中有很多嵌套或共享类型,则结构形式往往会更高效,也可能更清晰。如果您最终选择 struct 路线,您可能需要类似于 evanmcdonnal 的答案的内容。为简洁起见,我在这里使用了匿名结构。package mainimport "encoding/json"import "log"type M map[string]interface{}type Query struct {&nbsp; &nbsp; Query struct {&nbsp; &nbsp; &nbsp; &nbsp; QueryString struct {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Query string `json:"query"`&nbsp; &nbsp; &nbsp; &nbsp; } `json:"query_string"`&nbsp; &nbsp; } `json:"query"`}func main() {&nbsp; &nbsp; b, err := json.Marshal(M{"query": M{"query_string": M{"query": "query goes here"}}})&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatalln(err)&nbsp; &nbsp; }&nbsp; &nbsp; log.Println("&nbsp; &nbsp;As Map:", string(b))&nbsp; &nbsp; var q Query&nbsp; &nbsp; q.Query.QueryString.Query = "query in a struct"&nbsp; &nbsp; b, err = json.Marshal(q)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatalln(err)&nbsp; &nbsp; }&nbsp; &nbsp; log.Println("As Struct:", string(b))}

ibeautiful

Anonymous Struct是 Go 的一大特色。这是一个等效的 Go struct,JSON可以让您使用encoding/json包进行编组/解组:type MyType struct {&nbsp; &nbsp; Query struct {&nbsp; &nbsp; &nbsp; &nbsp; QueryString struct {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Query string `json:"query"`&nbsp; &nbsp; &nbsp; &nbsp; } `json:"query_string"`&nbsp; &nbsp; } `json:"query"`}是的,您可以只使用类型化变量而不引入新类型(如果这适合您的情况):var myVar struct {&nbsp; &nbsp; Query struct {&nbsp; &nbsp; &nbsp; &nbsp; QueryString struct {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Query string `json:"query"`&nbsp; &nbsp; &nbsp; &nbsp; } `json:"query_string"`&nbsp; &nbsp; } `json:"query"`}
随时随地看视频慕课网APP

相关分类

Go
我要回答