我如何创建这个 JSON 对象?

dev*_*nov 5 json go

{
  "query": {
    "query_string": {
      "query": "<query string>"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    test := map[string]map[string]map[string]string {
        "query": map[string]map[string]string {
            "query_string": map[string]string{
                "query": query,
             },
        },
    }
Run Code Online (Sandbox Code Playgroud)

eva*_*nal 4

在 Go 中,您可以解组为各种不同的结构。最模糊的是interface{}. 我建议您不要这样做,因为您会放弃获得任何真正类型安全的机会。另一个极端是使用结构,对于您的示例 json,它们看起来像这样;

type Wrapper struct {
    Query Query `json:"query"`
}

type Query struct {
    QueryString QueryString `json:"query_string"`
}

type QueryString struct {
     Query string `json:"query"`
}
Run Code Online (Sandbox Code Playgroud)

中间的东西,给你的例子 json 将是一个map[string]map[string]map[string]. 如果您不知道如何使用该encoding/json包,请查看此处的示例。https://golang.org/pkg/encoding/json/#example_Unmarshal

这非常简单,如果您在 a 中有输入,[]byte然后实例化您想要将其解组到的类型,您只需调用json.Unmarhsal(jsonBytes, &ThingToUnmarshalInto)

编辑:根据霍布斯的评论,您似乎实际上正在尝试将该 json 发送到服务器。在这种情况下,请使用上面的结构。其他答案中提供的示例演示了您需要的一切。一切都与我上面描述的几乎相同,只是您使用json.Marshal要转换为 json 字符串的实例进行调用,而不是将 json 字符串作为 a[]byte并将其传递到 unmarshal 以获得结构。我错误地认为你正在接收该 json,而不是试图形成它。