假设我定义一个结构如下:
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"
}
}
并将其解组到给定的结构中?
我是否缺少某些东西,或者只是需要使用反射功能从头开始编写它?
谢谢
答案 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值映射然后解组每个属性的想法。通常,您会进行更多的错误检查,以查看值是否存在,等等。可以肯定的是,它的工作量更大,但是它具有极大的灵活性,并且为您提供了有关如何处理数据的大量可见性和强大功能,而不仅仅是将其编组为一个结构并希望魔术起作用。