在Go中解组嵌套JSON到平面结构

时间:2018-11-20 01:10:27

标签: json go marshalling unmarshalling

假设我定义一个结构如下:

type User struct {
    ID          string
    Name        string
    Age         uint
    City        string      `json:"address.city"`
    Province    string      `json:"address.province"`
}

我能够采用User结构,并将展平的魔鬼扩展到带有地址对象的嵌套JSON结构中。但是,我正努力朝另一个方向努力。

我如何使用以下JSON:

{
    "ID": "1",
    "Name": "Keith Baldwin",
    "Age": 30,
    "address": {
        "city": "Saskatoon",
        "province": "Saskatchewan"
    }
}

并将其解组到给定的结构中?

我是否缺少某些东西,或者只是需要使用反射功能从头开始编写它?

谢谢

3 个答案:

答案 0 :(得分:1)

创建userInfo类

type UserInfo struct {
    ID      string `json:"ID"`
    Name    string `json:"Name"`
    Age     int    `json:"Age"`
    Address struct {
        City     string `json:"city"`
        Province string `json:"province"`
    } `json:"address"`
}

然后将您的json数据解组到userinfo对象中

var userInfo UserInfo
    jsonStr := `{
    "ID": "1",
    "Name": "Keith Baldwin",
    "Age": 30,
    "address": {
        "city": "Saskatoon",
        "province": "Saskatchewan"
    }
}`
json.Unmarshal([]byte(jsonStr), &userInfo)

答案 1 :(得分:0)

我认为您需要创建其他Address结构。

type Address struct {
    City     string `json:"city"`
    Province string `json:"province"`
}

type User struct {
    ID      string  `json:"id"`
    Name    string  `json:"name"`
    Age     uint    `json:"age"`
    Address Address `json:"address"`
}

答案 2 :(得分:0)

您可以创建一个临时结构类型,以将该数据转储为与您期望的格式匹配的数据。例如

int('.0')

尽管我最喜欢做的是将所有json都转储到带有字符串键和json.RawMessage作为值的映射中。这样,您就可以将所有json解组到地图中,然后根据需要解组每个字段。

type userData struct {
    ID          string
    Name        string
    Age         uint
    address     map[string]string
}

我没有测试任何代码,因此可能会出错,但这只是为了传达将所有数据转换为json.RawMessage值映射然后解组每个属性的想法。通常,您会进行更多的错误检查,以查看值是否存在,等等。可以肯定的是,它的工作量更大,但是它具有极大的灵活性,并且为您提供了有关如何处理数据的大量可见性和强大功能,而不仅仅是将其编组为一个结构并希望魔术起作用。