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,而不是试图形成它。
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))
}
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"`
}
- 3 回答
- 0 关注
- 162 浏览
添加回答
举报