我有一些JSON,我需要能够访问属性。由于JSON属性可能会有所不同,因此我无法创建struct
来解组。
示例
JSON可能就是这样:
{"name" : "John Doe", "email" : "john@doe.com"}
或者这个:
{"town" : "Somewhere", "email" : "john@doe.com"}
或其他任何内容。
如何访问每个属性?
答案 0 :(得分:5)
您可以将其解组为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.>一个完整的例子。
答案 1 :(得分:0)
如果您碰巧有可能未指定的字段,您可以使用指针将输入解组为结构。如果该字段不存在,则指针将为nil
。
package main
import (
"encoding/json"
"fmt"
)
type Foo struct {
A *string
B *string
C *int
}
func main() {
var input string = `{"A": "a","C": 3}`
var foo Foo
json.Unmarshal([]byte(input), &foo)
fmt.Printf("%#v\n", foo)
}
如果你真的想要更灵活的东西,你也可以将你的输入解组为map[string]interface{}
。
package main
import (
"encoding/json"
"fmt"
)
func main() {
var input string = `{"A": "a","C": 3}`
var foo map[string]interface{} = make(map[string]interface{})
json.Unmarshal([]byte(input), &foo)
fmt.Printf("%#v\n", foo)
}
答案 2 :(得分:0)
在解组JSON文档时,并非所有在结构中定义的属性都需要存在于JSON文档中。在您的示例中,您可以定义以下结构:
type MyJson struct {
Name string `json:"name"`
Town string `json:"town"`
Email string `json:"email"`
}
当您使用此结构来解组缺少一个或多个这些属性的JSON文档时,它们将使用相应类型的空值(string
属性的空字符串)进行初始化。
或者,您可以使用通用interface{}
类型进行解组,然后使用类型断言。这在blog post "JSON and GO":
var jsonDocument interface{}
err := json.Unmarshal(jsonString, &jsonDocument)
map := jsonDocument.(map[string]interface{})
town := map["town"].(string);