json是一种数据格式,经常被用作数据交换,页面展示,序列化等场景,基本每种语言都有对应的json解析框架,Go语言也不例外,并且内置了json库,基本能够满足一些普通开发场景,但有些复杂场景下就不太理想了,因此找一个好用的开源的json库就非常有必要了,先放地址

https://github.com/bitly/go-simplejson

内置json库的使用

我们创建一个如下结构体,用来测试内置json库和开源的json库,一起看看使用上是来怎么操作的呢?

//omitempty  这个属性可以在序列化时忽略0值和nil值
// score 不能序列化,属于私有字段
type Student struct {
Id int `json:"id"` //如果想json后的id是字符串可以这样写 `json:"id,string"`
Name string `json:"name"`
Age int `json:"age"`
score map[string]float32 `json:"score"`
Phone string `json:"phone,omitempty"`
Birthday JsonTime `json:"birthday"`
}

内置的json库基本上就两个方法 ToJson和FromJson,把一个对象转换为json字符串,把json字符串转化为对象,如下两个api,如果我们想要从json字符串中获取某个key时,或者想要知道某个value的类型时,此时内置库就不支持了,我们就需要想别的办法了

result, err := json.Marshal(v interface{})
err := json.Unmarshal(jsonStr []byte, v interface{})
//序列化
func ToJson(v interface{}) (string, error) {
result, err := json.Marshal(v)
if err != nil {
return "", nil
}
return string(result), nil
}
//反序列化
func FromJson(jsonStr []byte, v interface{}) error {
err := json.Unmarshal(jsonStr, v)
if err != nil {
log.Fatalln(err)
return err
}
return nil
}

simple-json的使用

这个框架使用起来非常简单,并且源码也非常简洁,只有三个源码文件,三个测试文件,感兴趣的同学可以研究下源码实现,simple-json是一个json解析库,就是说对json字符串进行解析,本身不支持序列化和反序列化

我们构造一个json字符串,然后使用simple-json根据我们的场景来解析这个字符串,得到我们想要的结果

s := `{
"tagA" : "json string",
"tagB" : 1024,
"tagD" : {
"tagE":1000
},
"tagF":[
"json array",
1024,
{"tagH":"json object"}
]
}`

首先我们获取一个json实例,框架本身支持多种方法获取一个json实力,可以直接创建,也可以在创建时直接指定一个json字符串,也可以通过文件的形式创建,这里我们使用使用第二种方式,也就是使用上面代码中的json2

json1 := simplejson.New()
json2 := simplejson.NewJson(bs [] byte)
json3 := simplejson.NewFromReader(r io.Reader)

1、第一个场景,获取key时tagA的值,下面代码中Get方法返回的还是Json实例,想要具体的值,得转换成值所对应得类型,假设我们已经知道这个值的类型,那么直接.String()就得到结果了

tagAValue ,err := json2.Get("tagA").String()

2、第二个场景, 获取数组中的key为tagH的值,首先获取tagF,返回Json实例,对应的是一个数组,获取下标为2的Json实例,再从这个Json实例中获取key为tagH的value

j,err := json2.Get("tagF").GetIndex(2).Get("tagH").String()

3、第三个场景,检查某一个key是否存在,第一个反馈的值是json实例,第二个返回的值是bool类型,true代表存在,false代表不存在,如果存在我们可以通过json实例直接转换成值的类型

if json, ok := json2.CheckGet("tagD"); ok { //true ,有该字段
result,_ := json.String()
fmt.Println(ok, result)
}

4、第四个场景,获取嵌套的key,simple-json提供了按照路径搜索的方法,也就是一层一层往下查找,每一层都是一个json实例,如下我们获取tagE

k, err := json2.GetPath("tagD", "tagE").Int64()

5、还有一个其他场景,比如删除一个key,获取key的时候返回默认值等

//删除key是tagA值
json2.Del("tagA")
//获取key是tagC的值,如果不存在,一定返回一个默认的字符串,当然也可以返回默认的bool值,int值,等
n := json2.Get("tagC").MustString("default")

simple-json的其他更多方法,使用场景大家可以更多地深入研究,欢迎留言探讨

一个非常棒的Go-Json解析库的更多相关文章

  1. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

  2. 一个用C++写的Json解析与处理库

    什么是Json?这个库能做什么? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is e ...

  3. python 中的json解析库

    当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...

  4. Tomjson - json 解析库

    Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...

  5. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

    Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...

  6. C++的Json解析库:jsoncpp和boost(转)

    原文转自 http://blog.csdn.net/hzyong_c/article/details/7163589 JSON(JavaScript Object Notation)跟xml一样也是一 ...

  7. 常用json解析库比较及选择 fastjson & gson

    一.常用json解析库比较及选择 1.简介 fastjson和gson是目前比较常用的json解析库,并且现在我们项目代码中,也在使用这两个解析库. fastjson 是由阿里开发的,号称是处理jso ...

  8. [转]C++的Json解析库:jsoncpp和boost

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...

  9. 深入 Go 中各个高性能 JSON 解析库

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算去看 JSON 库的性能问题的,但是最近我对 ...

  10. fastjson是阿里巴巴的开源JSON解析库

    fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}&q ...

随机推荐

  1. 微服务之服务治理_Eureka

    首先需要明确,不管是什么事物需要"治理",那一定是该事物存在一定问题.比如环境治理.那么服务,或者说微服务为什么需要治理?对于服务来说,如果它承担的业务职责简单,那其实治理的必要性 ...

  2. sqli-labs 18-19 --Header_injection

    sqli-labs 18 知识点 头部注入 报错注入 使用的函数: updatexml (XML_document, XPath_string, new_value); 第一个参数:XML_docum ...

  3. kubernetes环境搭建 -k8s笔记(一)

    一.环境准备 1.硬件及版本信息: cpu&内存:2核心,2G 网络: 每台vm主机2块网卡,一块NAT用于上网,别一块配置成 "仅主机模式",网段为192.168.100 ...

  4. MQTT协议 局域网和广域网 云服务器和虚拟主机、VPS SSH和FTP、SFTP

     MQTT协议 MQTT协议就很好的解决了coap存在的问题.MQTT协议是由IBM开发的即时通讯协议,相比来说比较适合物联网场景的通讯协议.MQTT协议采用发布/订阅模式,所有的物联网终端都通过TC ...

  5. .Net MVC Redirect出现:服务器无法在已发送 HTTP 标头之后设置状态解决方案

    使用过滤器控制权限时,若无权则跳转到无权页面,但是每次跳转都会出现 ERROR - System.Web.HttpException (0x80004005): 服务器无法在已发送 HTTP 标头之后 ...

  6. AOP的姿势之 简化 MemoryCache 使用方式

    0. 前言 之前写了几篇文章介绍了一些AOP的知识, 但是还没有亮出来AOP的姿势, 也许姿势漂亮一点, 大家会对AOP有点兴趣 内容大致会分为如下几篇:(毕竟人懒,一下子写完太累了,没有动力) AO ...

  7. java文本获取

    public static String Html2Text(String inputString) {         String htmlStr = inputString; // 含html标 ...

  8. [leetcode]725. Split Linked List in Parts链表分块

    思路很简单  按时链表的题做起来很容易犯小错误,思维要缜密 还要多练习啊 做之前最好画算法框图 public ListNode[] splitListToParts(ListNode root, in ...

  9. Linux音频编程--使用ALSA库播放wav文件

    在UBUNTU系统上使用alsa库完成了对外播放的wav文件的案例. 案例代码: /** *test.c * *注意:这个例子在Ubuntu 12.04.1环境下编译运行成功. * */ #inclu ...

  10. Scrum转型(二) Scrum的角色

    1.1 ScurmMaster 作为Scrum流程的捍卫者和布道者,ScrumMaster在Scrum团队中起到至关重要的作用,他们确保团队使用正确的流程,确保团队正确地召开各种会议,他们训练团队的敏 ...