这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战。
前言
我们经常遇到如何将 map[string]interface{}
转化为 struct
, 这个过程会用到反射, 通过反射可以实现,不确定的成员依然适用 map[string]interface{}
表示,确定结构后,再将 map[string]interface{}
解析为具体的某个结构。
主要使用的是 mapstructure
来实现,将 map
转换称 struct
一个第三方库,地址:github.com/mitchellh/m…
json
转换成 map
,然后 map
转换成 struct
json 转换成 struct
json 转换成 struct 只需要使用 json.unmashal
即可
1 | go复制代码type User struct { |
map 转换成 struct
代码原理: json.Unmarshal
将字节流解码为map[string]interface{}
类型, 然后使用mapstructure.Decode
将该 JSON
串分别解码为对象值。
下载包:
1 | arduino复制代码go get https://github.com/mitchellh/mapstructure |
测试代码
1 | go复制代码package jsontool |
执行结果:
1 | kotlin复制代码=== RUN TestMapStructure |
其中 msg 数据结构如下:
字段标签 mapstructure
默认情况下 mapstructure
使用结构体中字段的名称做映射,例如结构体中有一个 Title
字段, mapstructure
解码时会在 map[string]interface{}
中查找键名title
,并且字段不区分大小写。
也可以指定字段,设置 mapstructure
标签
1 | go复制代码type Blog struct { |
jpath 标签
通过jpath标签指明字段对应的map中实际的值
比如 有个字段Age,需要从map的birth字段转换过来,那么我的map和字段处理如下:
1 | go复制代码//map的结构: |
Metadata
mapstructure
执行转换的过程中会可能会一些错误,这个错误主要记录在 mapstructure.Metadata
结构如下:
1 | go复制代码// mapstructure.go |
- Keys:解码成功的键名;
- Unused:在源数据中存在,但是目标结构中不存在的键名。
测试程序:
1 | go复制代码var document3 = `{"categories":["12","222","333"],"people":{"name":"jack","age":{"birth":10,"year":2000,"animals":[{"barks":"yes","tail":"yes"},{"barks":"no","tail":"yes"}]}}}` |
执行结果:
1 | css复制代码=== RUN TestMetaData |
欢迎关注公众号:程序员财富自由之路
参考资料
本文转载自: 掘金