Golang如何反序列化包含异构嵌套社交对象的JSON文件
反序列化问题解答
现有结构体的兼容性结论
你当前定义的结构体可以正常完成反序列化,不会因为Social结构体同时声明两个字段导致失败。
Go标准库encoding/json的反序列化逻辑会自动匹配JSON中存在的字段,给对应结构体字段赋值,JSON中不存在的结构体字段会保持对应类型的零值:
- 反序列化Bob的数据时,Social结构体的
Facebook字段赋值为Bob_the_builder,Twitter字段保持空字符串 - 反序列化Alice的数据时,Social结构体的
Twitter字段赋值为Alice_the_builder,Facebook字段保持空字符串
注意你当前写的结构体代码有两处语法错误需要修正:
- Go的字符串类型是小写
string,不是大写String- 结构体JSON标签需要用反引号
`包裹,不能用单引号'
修正后的基础版本代码如下:
type User struct { Name string `json:"name"` Age int `json:"age"` Occupation string `json:"occupation"` Social Social `json:"social"` } type Social struct { Facebook string `json:"facebook"` Twitter string `json:"twitter"` }
更灵活的实现方案
如果后续可能新增更多社交平台类型,不想每次加平台都修改Social结构体,可以直接用map[string]string类型承载Social字段,适配任意平台的键值对:
type User struct { Name string `json:"name"` Age int `json:"age"` Occupation string `json:"occupation"` Social map[string]string `json:"social"` }
使用时可以直接通过user.Social["facebook"]、user.Social["twitter"]读取对应账号,也可以遍历map获取用户绑定的平台类型和账号。
内容的提问来源于stack exchange,提问作者LewHal
相关产品推荐
相关产品推荐

