问题解决:Golang的json包解析字段失败
引言
这个问题出现在解析一个json的配置文件时,排错了很久,最后和狗勋一起解决了这个奇怪的问题。
正文
其实这个问题并不难,因为Golang自带json包,所以我们要做的其实就是在需要解析的结构体中加上相应的标签就可以了,但是可能会出现一些隐性的bug,且没有任何的报错。
我一共遇到了两种问题,其中第一种比较好解决,网上的解决方案也大多是描述第一种问题;但是第二种问题就非常的蹊跷了,因为在项目中出现了问题,写了一个测试代码并没有复现成功。
第一种解决方案:结构体需要解析的相应字段应该大写。
我们先来看一段代码:
---test.json
{"page": 1,"fruits": ["apple", "peach"]
}---test_json.go
type response struct {number intPage int `json:page`fruits []string `json:fruits`
}func main(){data, _ := io.ReadFile("test.json")res := response{}json.Unmarshal(data, &res)fmt.Println(res)
}ouput:
{0 1 []}
我们可以看到在首字母小写时出现问题,解决方案也很容易,就是需要把字段开头改成大写,当然这样是有弊端的,因为一般需要从配置文件中读取的字段一般都是与配置相关的,而这些一般应该设置成private的,C++就可以很好的解决,这也许就是go不如C++自由的原因吧,当然这可能也是C++没有类似go这样json库的原因吧。
第二种解决方案:就是Goland的json解析要么加双引号,要么不加双引号名称中不能带下划线,即_
。
也就是上面的结构体应该写成这样:
type response struct {number intPage int `json:"page"`fruits []string `json:"fruits"`
}
也就是这样子,虽然这个测试代码不加双引号也可以正确解析出slice,但是在项目中的结构体却出现了问题,我把项目中的结构体中带json字段的提取出来就可以复现错误了:
---test.json
{"servers_address": ["localhost:8901","localhost:8902"],"myport" : ":8900","maxreries" : 13,"timeout_entry" : 200
}---test_json.go
type response struct {Maxreries int `json:maxreries`ServersAddress []string `json:servers_address`MyPort string `json:myport`TimeOutEntry int `json:timeout_entry`
}func main(){data, _ := io.ReadFile("test.json")res := response{}json.Unmarshal(data, &res)fmt.Println(res)
}ouput:
{13 [] :8900 0}
我们可以看到解析失败,ServersAddress
和TimeOutEntry
解析失败,这已经不是解析slice失败了,int也出现问题,让我们加上双引号看看:
ouput:
{13 [localhost:8901 localhost:8902] :8900 200}
我们可以看到解析成功。
那么不加双引号为什么有时可以解析成功,有时不可以呢?因为已经不是解析slice失败了,而解析int也同样出现了错误。
观察两个出现问题的字段,发现它们有一个共同点,就是json标签中都带了_
,让我们去掉执行看看:
{13 [localhost:8901 localhost:8902] :8900 200}
排查出错误!就是Golang的json解析在结构体json标签不加双引号时无法解析名称带_
的字段!
这个问题估计是一个极其隐式的问题,官方文档中也没有描述,网上在此之前也没有一篇文章描述这个问题,希望看完这篇文章能帮助你解决这个令人困惑不以的问题。
参考:
- 博文《Go by Example: JSON》
- 文档《func Unmarshal》
问题解决:Golang的json包解析字段失败相关推荐
- 车联网V2X-BSM消息JSON包解析
遇到一个需求,解析BSM消息的JSON包,网上下载cJSON.h和cJSON.h,然后解析BSM1.json文件. BSM1.json文件内容如下: {"ego_infor":[{ ...
- golang xml和json的解析与生成
golang中解析xml时我们通常会创建与之对应的结构体,一层层嵌套,完成复杂的xml解析. package main;import ("encoding/xml""fm ...
- golang(8):使用golang 的 encoding/json 做解析,然后转换成 create sql
前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/88837310 未经博主允许不得转载. 博主地址是:http://blog ...
- Go基础:常见的json包--encoding/json、easyjson、ffjson、json-iterator/go
本文对常见的json包做一些介绍,方便快速入门.每一小节均有示例说明.大家在实际开发中可以选择适合自己的json包. encoding/json encoding/json是官方提供的标准json, ...
- 如何在Swift3中获取Json包的内容(unwrap Json package)
我想在这个帖子里面总结两个问题:一个是通过ReST获取Json的语句,这个比较简单 另一个是如何将Json包一层一层转存为字典,并最终通过keyword: String获得所需内容的方法 废话不说,来 ...
- 细说Golang的JSON解析
之前一直写一些动态语言,觉得解析JOSN还是很简单的,往往只需要几行代码就能拿到解析好的JSON对象.Go语言自带的json包可以让你在程序中方便的读取和写入 JSON 数据.生成JSON场景相对简单 ...
- Golang 从 Json 串中快速取出需要的字段
Golang 从 Json 串中快速取出需要的字段 在 web 编程中很多情况下接口的数据是 json 格式,在我们拿到接口的 json 数据后如何方便地从中提取出需要的字段呢?我们可以自定义一个结构 ...
- 基于QT的【第一个项目】设计+所有组件配合使用+网络编程局域网通信+文件IO操作+登录界面和头像+多界面跳转+JSON数据解析+表情包制作
基于QT的第一个项目+所有组件配合使用+网络编程局域网通信+文件IO操作+登录界面和头像+多界面跳转+JSON数据解析+表情包制作 第一阶段 网络编程局域网TCP/IP聊天QT实现 main.c ma ...
- (转)json数据解析异常而导致网络请求失败的解决办法(其一)
原文出处 https://www.jianshu.com/p/d6bd6bd5fce3 参考文章 问题概述 笔者在开发过程中临时遇到一个本来仅有web端的项目临时增加Android端,导致后端在出接口 ...
最新文章
- LeetCode简单题之二分查找
- 强化学习:10种真实的奖励与惩罚应用
- matlab Lasso回归
- python求1到n的乘积_Python简单实现两个任意字符串乘积的方法示例
- [VMM 2008虚拟化之初体验-2] 界面功能介绍
- C语言普及组NOIP考试培训,NOIP 2018普及组复赛解题报告来了!
- $(document).ready、body.Onload()和 $(window).load的区别
- layui 单独使用日期组件
- 大气校正后的ndvi_Sentinel2 L1C下载、大气校正、重采样
- 小米手机证书信任设置在哪里_小米手机闹钟在哪里?闹钟怎么设置?怎么找到闹钟?...
- 解决 idea 运行 Spring Boot 项目启动慢的问题
- 自定义View(一)-ViewGroup实现优酷菜单
- 计算机派位志愿填报技巧,小升初电脑派位 填报也有技巧
- 根据GPS经纬度计算距离和位置获取
- 软件工程——软件详细设计
- FL Studio20.9进阶版 果味版 高级版 完整版区别
- python爬虫之淘宝秒抢软件
- matlab 中 矩阵取平方,matlab中怎样计算一个矩阵中每个数的平方
- 【专访】黄健宏:为什么真正的聪明人喜欢用笨方法?
- 【语音识别】基于keras的简易语音识别
热门文章
- Luogu 3287 LOJ 2211 BZOJ 3594 [SCOI 2014] 方伯伯的玉米田 详解
- 隆尧县农特产品区域公用品牌“尧尧领鲜”正式发布!
- python爬虫豆瓣电影按电影类型,豆瓣电影---按分类爬取
- 【LG006.精灵传说】我是定时器
- ConcurrentHashMap源码解析_02 预热(内部一些小方法分析)
- ble mesh和ble之间关系
- 关于shift-jis编码转换utf-8
- Python 自动读取163邮箱收取的验证码
- 【JAVA】vivo2021届秋季校招笔试在线编程
- FPGA学习:timescale简介