不使用struct时访问JSON属性

时间:2016-01-01 17:58:28

标签: go

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

示例

JSON可能就是这样:

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

或者这个:

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

或其他任何内容。

如何访问每个属性?

3 个答案:

答案 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)
}

Playground

如果你真的想要更灵活的东西,你也可以将你的输入解组为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)
}

Playground

答案 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);