如何在Golang中创建此JSON对象?

时间:2015-12-09 18:50:02

标签: json go

{
  "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,
             },
        },
    }

3 个答案:

答案 0 :(得分:3)

在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"`
}

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

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

编辑:基于hobbs的评论,看来你实际上是在试图让json发送到服务器。在这种情况下,请使用上面的结构。另一个答案中提供的示例演示了您需要的一切。一切都和我上面描述的几乎一样,除非你用{j}字符串中的实例来调用json.Marshal,而不是将json字符串作为[]byte并且将它传递给unmarshal以获得结构。我错误地认为你收到了json,而不是试图形成它。

答案 1 :(得分:2)

以下是Play使用map方式和struct方式的示例。

正如您所看到的,如果您需要发送一个这样的请求,那么地图表单通常会更少代码并且更清晰。

如果您的请求中有很多嵌套或共享类型,那么结构形式往往会更高效,并且可能更清晰。如果你最终走向结构路线,你可能会想要一些类似于evanmcdonnal答案的东西。为简洁起见,我在这里使用了匿名结构。

package main

import "encoding/json"
import "log"

type M map[string]interface{}

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

func main() {
    b, err := json.Marshal(M{"query": M{"query_string": M{"query": "query goes here"}}})
    if err != nil {
        log.Fatalln(err)
    }
    log.Println("   As Map:", string(b))


    var q Query
    q.Query.QueryString.Query = "query in a struct"
    b, err = json.Marshal(q)
    if err != nil {
        log.Fatalln(err)
    }
    log.Println("As Struct:", string(b))
}

答案 2 :(得分:1)

Anonymous Struct是Go的一个很好的功能。对于您的struct使用 encoding / json 包进行封送/取消封送,这相当于Go JSON

type MyType struct {
    Query struct {
        QueryString struct {
            Query string `json:"query"`
        } `json:"query_string"`
    } `json:"query"`
}

是的,您可以在不引入新类型的情况下使用类型变量(如果适合在您的情况下使用):

var myVar struct {
    Query struct {
        QueryString struct {
            Query string `json:"query"`
        } `json:"query_string"`
    } `json:"query"`
}