本文汇总一些工程中使用到的和 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. 2022-2028年中国TPE手套行业市场全景调查及发展策略分析报告
  2. 使用分层实现业务处理(二)
  3. 五、开始Github和码云之旅,新手如何上路
  4. python twisted教程 二:缓慢的诗
  5. 安卓应用安全指南 5.2.2 权限和保护级别 规则书
  6. Windows下配置Apache服务器
  7. PDMS二次开发应用案例——PipelineTool
  8. 判断日期yyyymmdd
  9. 问诊把脉“实景三维业务发展瓶颈在哪里”和“御医良方”
  10. 长方形图片填充为正方形
  11. 一台液晶显示器台式计算机总耗电量,一天一台电脑用多少电
  12. 文件系统FastDFS和阿里云OSS
  13. 收官之战,年终的财务分析如何做?
  14. 计算机十年歌曲,抖音还有多少个十年能勇敢做热血青年是什么歌
  15. 如何在windows 10或11下制作外接便携式可移植启动盘(以安装最新的ubuntu 22.04为例)
  16. 蓝桥杯 灭鼠先锋 博弈
  17. 案例分析——2020春HIT网络与社会导论
  18. win10打开语言服务器,在 Windows 10 中,部署一个 Go 1.13 语言的本地文档浏览 web 服务器的流程(已缺少 godoc.exe)...
  19. 赛普拉斯CYpress,初接触之一电磁感应触摸按键demo
  20. Cognos问题解决

热门文章

  1. c++全局变量怎么定义_C errno全局变量是否是线程安全的
  2. 微信加入新功能,60秒语音不必从头听到尾,网友:还需要进度条
  3. 宁德时代拟再投240亿元扩产宜宾基地
  4. 不是明年年初?苹果明年三季度才会推出AirPods Pro 2
  5. 苹果正在研发iPhone检测抑郁症功能
  6. 8月份比亚迪纯电动汽车产销量双双超过3万辆 是去年同期3倍多
  7. 一年3000家企业涌入,站上风口的男色经济难逃烧钱亏损
  8. 华为P50系列开始量产:Pro+版或进一步延期
  9. Lyft出售自动驾驶部门给丰田子公司:作价5.5亿美元
  10. 月球好忙 蓝色起源2024年要将首位女性送上月球表面