为了账号安全,请及时绑定邮箱和手机立即绑定

我如何创建这个 JSON 对象?

我如何创建这个 JSON 对象?

Go
拉莫斯之舞 2021-11-29 15:39:17
{  "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 回答

?
缥缈止盈

TA贡献2041条经验 获得超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"`

}

中间的东西,给你的例子 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,而不是试图形成它。


查看完整回答
反对 回复 2021-11-29
?
交互式爱情

TA贡献1712条经验 获得超3个赞

下面是一个使用 map 方式和 struct 方式的Play示例。


如您所见,如果您需要像这样发送一个请求,地图表单的代码通常更少,而且更清晰。


如果您的请求中有很多嵌套或共享类型,则结构形式往往会更高效,也可能更清晰。如果您最终选择 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))

}


查看完整回答
反对 回复 2021-11-29
?
ibeautiful

TA贡献1993条经验 获得超5个赞

Anonymous Struct是 Go 的一大特色。这是一个等效的 Go struct,JSON可以让您使用encoding/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"`

}


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信