本文汇总一些工程中使用到的和 reflect 有关的代码示例。由于是代码片段,不一定保证完整。

解析json

本节介绍解析json的一些方法。json 可来自文件,也可来自字符串,无论哪种,都是先转换成[]byte,再调用json.Unmarshal解析。
有时候并不关注完整的 json 格式,我们可以只取其中一部分字段,因此,可使用map[string]interface{}来接收解析结果(注意如是数组,则须使用数组形式)。

从json文件解析其字段

    file, err := os.Open(filename)if err != nil {fmt.Printf("open file %s error: %s\n", filename, err)return}defer file.Close()read := io.Reader(file)data, _ := ioutil.ReadAll(read)var v []map[string]interface{}err = json.Unmarshal(data, &v)if err != nil {fmt.Printf("Unmarshal error: %s\n", err)return}// 假定filename里面有很多的json数组,一一遍历for _, idx := range v {fmt.Println(idx["foo"])...}

从json字符串解析

一个简单的示例,从字符串组装,到解析,到提取其中某个字段。

func TestJsonSimple(t *testing.T) {
// 原始json字符串不能格式化,必须转换成[]byte
orgJsonString :=
`{"enID":"ID250","exID":"ID251","type":1,"money":250.44,"distance":274050}`// 虽然不知道具体结构体,但知道json只有一个,不是数组var data map[string]interface{}// 解析err := json.Unmarshal([]byte(orgJsonString), &data)if err != nil {fmt.Println(err.Error())return}fmt.Printf("%#v\n", data);fmt.Println(data["money"]) // 并不关心其它字段,只抽取所需的fmt.Println(data["money1"]) // 不存在,返回nil
}

输出:

map[string]interface {}{"distance":274050, "enID":"ID250", "exID":"ID251", "money":250.44, "type":1}
250.44
<nil>

json中嵌套数组,并获取数组内容:

func showInterface(origin interface{}) {switch reflect.TypeOf(origin).Kind() {case reflect.Slice, reflect.Array:s := reflect.ValueOf(origin)for i := 0; i < s.Len(); i++ {fmt.Printf("%d: %v\n", i, s.Index(i))}case reflect.String:s := reflect.ValueOf(origin)fmt.Printf("only string %v\n", s.String())case reflect.Int:s := reflect.ValueOf(origin)fmt.Printf("only int %v\n", s.Int())}
}func TestJsonArray(t *testing.T) {orgJsonString :=
`{"enID":"ID500","exID":"ID501","type":2,"money":27.00,"distance":28322,"splitInfo":[{"index":1,"pTag":"11","pMoney":700},{"index":2,"pTag":"12","pMoney":2000}]}`// 解析var data map[string]interface{}err := json.Unmarshal([]byte(orgJsonString), &data)if err != nil {fmt.Println(err.Error())return}fmt.Printf("org json:\n%#v\n\n", data);showInterface(data["enID"])showInterface(data["splitInfo"])
}

data["splitInfo"]是一个interface,此刻并不知道具体的内容,因此无法再获取内部的字段或长度。可以利用reflect.TypeOf获取类型,如是数组,需要遍历。详见代码。
输出:

org json:
map[string]interface {}{"distance":28322, "enID":"ID500", "exID":"ID501", "money":27, "splitInfo":[]interface {}{map[string]interface {}{"index":1, "pMoney":700, "pTag":"11"}, map[string]interface {}{"index":2, "pMoney":2000, "pTag":"12"}}, "type":2}only string ID500
0: map[index:1 pMoney:700 pTag:11]
1: map[index:2 pMoney:2000 pTag:12]

接上,如果只需要获取data["splitInfo"]的长度。注意,此处是知道该字段是数组,但不知道其内容(或不关注内容),可直接用reflect.ValueOf求出长度,如下:

    mylen := reflect.ValueOf(data["splitInfo"]).Len()fmt.Println("splitInfo len: ", mylen)

Golang实践录:反射reflect的一些研究及代码汇总相关推荐

  1. Golang实践录:命令行cobra库实例再三优化

    本文是上一文章<Golang实践录:命令行cobra库实例优化> 的优化,主要的子命令的业务实现的整理. 起因 上一版本实现的方式,还是有点不满意,格式也不对齐,重要的是,似乎不是正规的方 ...

  2. Golang实践录:命令行cobra库实例优化

    本文上一文章<Golang实践录:命令行cobra库实例> 的优化,主要的子命令的业务实现的整理. 起因 旧版本中,每个子命令的入口函数,均需一一判断传入参数,并调用对应的业务实现函数,编 ...

  3. Golang实践录:利用反射reflect构建通用打印结构体接口

    本文针对 Golang 的结构体字段的打印进行一些研究.其中涉及到一些反射的知识. 问题提出 总结一些实践情况,结构体字段值的输出还是比较常见的,至少笔者目前常用.比如输出某些数据表的数据(代码中会转 ...

  4. go 获得 mysql 实际运行 SQL,Golang实践录:一个数据库迁移的代码记录

    实现一个数据库迁移的案子.有些知识点值得记录. 技术框架 github.com/go-xorm/xorm:数据库操作 github.com/denisenkom/go-mssqldb:sqlserve ...

  5. Golang实践录:一个数据库迁移的代码记录

    实现一个数据库迁移的案子.有些知识点值得记录. 技术框架 github.com/go-xorm/xorm:数据库操作 github.com/denisenkom/go-mssqldb:sqlserve ...

  6. Golang实践录:静态资源文件整合:web服务

    趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文研究静态资源文件的在 web 服务器的整合. 基础 Golang 中的 web 服务框架有很多种,本文选取 gi ...

  7. Golang实践录:静态资源文件整合:初步使用

    趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文介绍如何在 Golang 中整合静态资源文件,将静态资源文件编译到二进制可执行文件中,这与其它程序的打包可能是一 ...

  8. Golang实践录:调用C++函数

    趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文介绍如何在 Golang 中调用 C++ 函数. 起因 因工作需求,需要将一个工具由终端行的运行方式迁移到 we ...

  9. Golang实践录:我的工具包

    程序员难免会自造轮子,因为有时候自己的轮子才更适合自己,golang 的生态圈不错,官方的,非官方都有很多不同功能的库.本文从小处着眼,基于 github 开源工程创建属于自己的工具包. 简单介绍 本 ...

最新文章

  1. c++反汇编与逆向分析技术揭秘_C++反汇编与逆向分析技术揭秘
  2. 集成CDI和WebSockets
  3. 完全相同的4个小矩形如图所示放置_吸睛!矩形在PPT中的创意表现
  4. MyCat分布式数据库集群架构工作笔记0003---Mycat的作用
  5. 1024当当限量优惠码!花150买400的书,花220买600的书!
  6. OC继承以及实例变量修饰符
  7. 斐波那契数列(递归和非递归实现)
  8. 诺顿无法启动扫描,扫描引擎返回错误0x20000058错误
  9. 剑指offer--两个链表的第一个公共结点
  10. 随机信号分析学习笔记(3)
  11. 我的世纪佳缘线下的被骗经历。
  12. 注册表看计算机配置命令行,regedit-注册表编辑器及其命令行使用
  13. 【typescript】infer的理解与使用
  14. python爬取实习僧
  15. Ubuntu下安装Maskrcnn_benchmark(pytorch)踩坑分享
  16. 鼠标双击成了查看属性是怎么回事?怎样解决?
  17. 终端模拟器编译c语言,开源一个Flutter编写的完整终端模拟器
  18. kibana 失效原因 ,亲测有效
  19. ESP-Hosted:降低物联网设备的部署成本与复杂性
  20. 网络安全保障之“三同步”

热门文章

  1. yii2 关掉php notice,php – 使用Yii2中的自动填充更新隐藏字段
  2. JavaScript图片 向下闪缩放的效果
  3. 小米正式发布潮流手机小米Civi 1S和小米智能家庭屏10两款重磅新品
  4. 2022春节档电影票房破20亿元
  5. 王者荣耀、QQ音乐发声明:异常登录问题已解决
  6. 库克用iPhone12 Pro Max发中秋祝福 网友调侃:库克也没抢到iPhone13?
  7. 顺丰控股子公司亮榛拟1000万美元参投海外投资基金
  8. 东风、吉利、比亚迪等车企被工信部点名 因产品不符合标准
  9. 宠物也能买保险了!鼻纹识别就能建立专属电子档案
  10. 扎心!全国6.5亿网民月收入不足5000元