3 回答
TA贡献1775条经验 获得超11个赞
创建用户信息类
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)
TA贡献1820条经验 获得超9个赞
我认为您需要创建一个其他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"`
}
TA贡献1863条经验 获得超2个赞
您可以创建一个临时结构类型来将该数据转储到与您期望的格式匹配的格式中。例如
type userData struct {
ID string
Name string
Age uint
address map[string]string
}
尽管我最喜欢做的事情是将所有 json 转储到一个地图中,其中包含字符串键和 json.RawMessage 作为值。这将允许您将所有 json 解组到此映射中,然后根据需要解组每个字段。
var allData map[string]json.RawMessage
var user User{}
//Assuming we first get our json from a request, otherwise use json.Unmarshal(jsonData, &allData)
err := json.NewDecoder(r.Body).Decode(&allData)
if err != nil {
//handle
}
err = json.Unmarshal(allData["ID"], &c.ID)
if err != nil {
//handle
}
var addressMap map[string]string
err = json.Unmarshal(allData["address"], addressMap)
if err != nil {
//handle
}
c.City = addressMap["city"]
c.Province = addressMap["province"]
我没有测试任何代码,因此它可能会出错,但这只是为了传达将所有数据转换为 json.RawMessage 值的映射然后解组每个属性的想法。通常你会有更多的错误检查来查看值是否存在等。当然,它需要更多的工作,但它非常灵活,让你对数据的处理方式有更多的可见性和权力,而不是仅仅解组到一个结构并希望魔法起作用。
- 3 回答
- 0 关注
- 145 浏览
添加回答
举报