不使用结构时访问 JSON 属性

我有一些 JSON,我需要能够访问这些属性。由于 JSON 属性可能会有所不同,因此我无法创建struct要解组的对象。

例子

JSON 可能是这样的:

{"name" : "John Doe", "email" : "john@doe.com"}

或这个:

{"town" : "Somewhere", "email" : "john@doe.com"}

或其他任何东西。

如何访问每个属性?


慕尼黑的夜晚无繁华
浏览 214回答 3
3回答

牧羊人nacy

您可以将其解组为interface{}. 如果这样做,json.Unmarshal会将 JSON 对象解组为 Go 映射。例如:var untypedResult interface{}err := json.Unmarshal(..., &untypedResult)result := untypedResult.(map[string]interface{})// ... now you can iterate over the keys and values of result ...请参阅 < http://blog.golang.org/json-and-go#TOC_5。> 一个完整的例子。

米琪卡哇伊

如果您碰巧有可能未指定的字段,您可以将输入解组到带有指针的结构中。如果该字段不存在,则指针将为nil。package mainimport (&nbsp; &nbsp; "encoding/json"&nbsp; &nbsp; "fmt")type Foo struct {&nbsp; &nbsp; A *string&nbsp; &nbsp; B *string&nbsp; &nbsp; C *int}func main() {&nbsp; &nbsp; var input string = `{"A": "a","C": 3}`&nbsp; &nbsp; var foo Foo&nbsp; &nbsp; json.Unmarshal([]byte(input), &foo)&nbsp; &nbsp; fmt.Printf("%#v\n", foo)}如果你真的想要更灵活的东西,你也可以将你的输入解组到map[string]interface{}.package mainimport (&nbsp; &nbsp; "encoding/json"&nbsp; &nbsp; "fmt")func main() {&nbsp; &nbsp; var input string = `{"A": "a","C": 3}`&nbsp; &nbsp; var foo map[string]interface{} = make(map[string]interface{})&nbsp; &nbsp; json.Unmarshal([]byte(input), &foo)&nbsp; &nbsp; fmt.Printf("%#v\n", foo)}

收到一只叮咚

解组 JSON 文档时,并非结构中定义的所有属性都需要出现在 JSON 文档中。在您的示例中,您可以定义以下结构:type MyJson struct {&nbsp; &nbsp; Name string `json:"name"`&nbsp; &nbsp; Town string `json:"town"`&nbsp; &nbsp; Email string `json:"email"`}当您使用此结构解组缺少一个或多个这些属性的 JSON 文档时,它们将使用相应类型的 null 值(string属性的空字符串)进行初始化。或者,您可以使用泛型interface{}类型进行解组,然后使用类型断言。这在博客文章“JSON and GO”中有详细记录:var jsonDocument interface{}err := json.Unmarshal(jsonString, &jsonDocument)map := jsonDocument.(map[string]interface{})town := map["town"].(string);
打开App,查看更多内容
随时随地看视频慕课网APP