在golang中解组扁平和嵌套的jsons

时间:2017-06-16 16:49:30

标签: json go unmarshalling

假设我希望能够处理以下表单的嵌套和未嵌套json,如下例所示:

source_json_1 := `{"owner": "John", "nickname": "Rose", "species": "Dog"}`
source_json_2 := `{"owner": "Doe", "Pet": [{"nickname": "Rose", "species": "Dog"},
                                          {"nickname": "Max", "species": "Cat"}]}`

如果我将Pet定义为嵌入式结构,我可以使用以下方法轻松解组:

type Owner struct {
    Name string
    Pet
}

type Pet struct {
    NickName    string
    Species     string
}

导致约翰的宠物得到充分的编组。

{John {Rose Dog}}
{Doe { }}

但由于Pet实际上也可以是Pet的一部分,因此Doe的Pet未被正确解组。如果改为

type Owner struct {
    Name string
    Pet  []Pet
}

然后Doe被编组好了。

{John []}
{Doe [{Rose Dog} {Max Cat}]}

我怎样才能抓住这两种情况?

无论如何,我最好还是把它编成一片Pet s。

1 个答案:

答案 0 :(得分:2)

您正在查看两个单独的数据结构,因此要使用单个struct类型解组它们,您需要考虑两者:

type Owner struct {
    Name string
    Pet
    Pets []Pet `json:"Pet"`
}

然后,如果您希望切片具有权威性,则在取消编组后,将嵌入式移动到切片:

// owner := unmarshall blah blah
if owner.Pet != Pet{} {
    owner.Pets = append(owner.Pets, owner.Pet)
}