Go语言学习#11-如何解析json字符串

本文最后更新于2018年10月31日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

=Start=

缘由:

现在的json格式用的非常之多,比如:配置文件,接口之间的数据传递。所以,用Go 语言来对json字符串进行读取、解析、在各类型之间进行转换是一个非常常见的问题,这里简单整理总结一下,方便以后用到的时候参考。

正文:

参考解答:

Go 语言在内置的”encoding/json”库中提供了Marshal和Unmarshal函数以支持(已知结构的)struct结构体和json字符串之间的转换:

1、将固定格式的json字符串转换成struct结构体

来一个实际点的例子就是:通过接口 http://ipinfo.io/json 获取自己网络出口公网IP地址的相关信息如下:

然后你想从上面这段json字符串中解析出IP地址和地区region出来,因为返回内容的格式都是固定的,所以我们可以先对着内容定义一个结构体IpInfo出来,借助Unmarshal函数将json字符串解析到一个IpInfo结构体变量中,然后进行下一步的处理:

2.将struct结构体变量转换成json字符串的形式

这里列出两个方法:

  • json.NewEncoder(b).Encode(struct_var)
  • b2, err := json.Marshal(struct_var)

3.嵌套json字符串的解析

上面2种讲的其实都是格式比较简单的json字符串的处理,但实际场景中可能嵌套格式的json字符串会占多数,比如:

针对这种较为复杂的嵌套格式json字符串的处理,方法简单的来说有3种:

  • 一、先定义好(对应格式)嵌套结构的struct结构体;
  • 二、先使用 interface{} 接收,实际使用的时候再处理一遍;
  • 三、直接使用外部包,比如:gjson或者fastjson

这里为了演示方便起见,先用gjson试试,其中nested.json文件的内容是上面的那段json字符串。

 

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/4151.html

《Go语言学习#11-如何解析json字符串》上有4条评论

  1. Go 语言操作 JSON 的几种方法
    https://morning.work/page/go/json.html

    # 标准库的 json 模块
    Go 语言标准库 encoding/json 提供了操作 JSON 的方法,一般可以使用 json.Marshal 和 json.Unmarshal 来序列化和解析 JSON 字符串:

    # 更加灵活和更好性能的 jsoniter 模块
    标准库 encoding/json 在使用时需要预先定义结构体,使用时显得不够灵活。这时候可以尝试使用 github.com/json-iterator/go 模块,其除了提供与标准库一样的接口之外,还提供了一系列更加灵活的操作方法。

    # 另辟蹊径提高性能的 easyjson 模块
    标准库 encoding/json 需要依赖反射来实现,因此性能上会比较差。 github.com/mailru/easyjson 则是利用 go generate 机制自动为结构体生成实现了 MarshalJSON 和 UnmarshalJSON 方法的代码,在序列化和解析时可以直接生成对应字段的 JSON 数据,而不需要运行时反射。据官方的介绍,其性能是标准库的 4~5 倍,是其他 json 模块的 2~3 倍。

    ## benchmark
    从以上结果可以看到, jsoniter 在序列化和解析时均有比较好的性能, easyjson 次之,标准库 json 则在解析时性能比较差。当然,这并不是一个比较严格的性能测试,比如没有考虑内存分配问题以及多种不同的 JSON 结构和数据长度的测试。但是,如果综合考虑性能和灵活性, jsoniter 可能是一个不错的选择。

发表评论

电子邮件地址不会被公开。 必填项已用*标注