工作过程中,经常需要使用json这种轻量级的数据交换格式,例如,通过它可以组织数据保存到配置文件,客户端和服务端通过json格式来进行通信等,但是,针对特定的需求场景,需要设计怎样的json格式比较合适呢,json到底可以支持多少种格式呢,有没有一种简单的概括,就能让使用者轻松使用它呢!
一般知识都有基本的理论结构,所以,本文首先将说明json的基本知识点,然后基于开源软件jsoncpp来说明如何构建/读写json, 再分享个人的使用心得,最后再总结json的关键要点,理解了这一点,玩转json不是问题。
一、Json简介
Json是轻量级的数据交换格式,它便于阅读和编写,它是完全独立于程序语言的文本格式。
二、Json结构
Json有两个结构, 分别是“名称/值”对的集合和值的有序列表。“名称/值”对的集合可以简单理解为对象集合,而值的有序列表可以理解为数组。
这里举一个“名称/值”对的集合的例子,它是以左大括号开始,以右大括号结束,中间是由多个“名称/值”对组成,各个“名称/值”对之间用逗号隔开。
举一个“值的有序列表”的例子,它是以左中括号开始,以右中括号结束,中间是由多个值组成,各个值之间用逗号隔开。
三、Json形式
Json主要由三种形式,分别为对象(object), 数组(array), 值(value)。
对象(object)是“名称/值”对集合,名称与值之间通过冒号隔开,另外对象是以左大括号开始,以右大括号结束。
数组(array)是值的有序集合,它是以左中括号开始,以右中括号结束。
值(value)可以是字符串(string)、数值(number)、对象(object)、数组(array)、true、false、null。这里我们会发现对象(object)里面有值(value), 数组(array)里面也有值(value), 而值(value)又包含有对象和数组,所以它们是可以嵌套的。
Json就是由上面简单的元素来组建复杂的信息元素。
四、Json例子
jsoncpp是C++语言编写的开源json库,通过该库,我们可以很容易的构建、读写json。接下来就基于jsoncpp来实现几个构建、读取json的例子。通过例子可以对json有更深的理解。jsoncpp最基本的对象就是Json::Value。
构建一个最简单的对象,然后输出整个json信息,最后读取json值,先调用isMember判断名称是否为root成员,如果是的话,那么就读取输出。
输出的日志信息如下所示,大括号包含了一个“名称/值”对。
构建嵌套对象,第一个“名称/值”对中的“值”又是一个对象。
输出的日志信息如下所示
构建三层嵌套对象,第一个“名称/值”对中的“值”是一个对象,而该对象的“值”又是一个对象。依次类推,可以构建更多层的嵌套对象。
输出的日志信息如下所示
构建简单的数组,jsoncpp中构建数组是通过append的接口来创建的。读取数组之前,先调用isArray来判断对象是否为数组,如果是的话,再读取输出。这里需要注意数组的个数。从防御式编程的角度看,读取数组值之前,需要判断数组索引是否在有效范围内。
输出的日志信息如下所示,从这里我们也可以确定数组是可以单独作为独立json串出现的。之前一直都有一个误区,就是认为json一定要用大括号包括起来。
构建对象和数组组成的json。首先创建一个数组,然后将其作为对象的值
输出的日志信息如下所示
最后再构建稍微复杂一点的json串,它是由对象、数组、对象来组成的,即对象的值是一个数组,而数组内部的值是由对象组成。
输出的日志信息如下所示
五、使用心得
- 读取json值之前,先判断其有效性,可以结合断言机制,调用isMember或者isArray来进行判断。
- 使用数组的时候,需要特别注意数组下标。
六、总结
json主要是由对象或数组创建而成,而它们的嵌套使用就可以创建复杂的json串,根据特定场景的需求来创建适用的json格式。