目录
一、前言
思考这么一个问题:对于不同的设备如何进行数据交换?可以考虑使用轻量级别的 JSON 格式。
那么需要我们手写一个 JSON 解析器吗?这大可不必,因为已经有前辈提供了开源的轻量级的 JSON 解析器——cJSON。我们会用就可以了,当然你也可以深入源码进行学习。
下图则向我们展示了如何通过 cJSON 实现 Client 与 Server 的数据交换:
- Client 在发送数据之前,通过 cJSON 将自己的专属数据格式 Data_ClientFormat 转化为了通用格式 JSON
- 服务端在收到 JSON 数据后,通过 cJSON 将其转化为服务端的专属数据格式 Data_ServerFormat
- 反之同理
在介绍 cJSON 之前,先来对 JSON 这个数据格式有个简单了解。
二、JSON 简介
1.1 什么是 JSON
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)。但它并不是编程语言,而是一种可以在服务器和客户端之间传输的数据交换格式。
1.2 JSON 结构
JSON 的两种数据结构:
- 对象:A collection of key/value pairs(一个无序的 key / value 对的集合)
- 数组:An ordered list of values(一 / 多个 value 的有序列表)
从上述描述中,我们可以获得如下四种信息:
- 对象(Object)
- 数组(Array)
- 键(key)
- 值(Value)
1.3 JSON 对象
JSON 对象具体格式如下图所示:
- 一个对象以
{
开始,以}
结束,是若干「key / value 对」的集合 - key 和 value 使用
:
分隔 - key / value 对之间使用
,
分隔
注意事项:
- 键:必须是 string 类型
- 值:可以是合法的 JSON 数据类型(字符串、数值、对象、数组、布尔值或 null)
如,这是一个合法的 JSON 对象:
{
"name" : "张三"
}
这也是一个合法的 JSON 对象:
{
"name" : "张三",
"age" : 18,
"sex" : "男"
}
1.4 JSON 数组
JSON 数组具体格式如下图所示:
- 一个数组以
[
开始,]
结束,是若干 value 的有序集合 - 多个 value 以
,
分隔
如,这是一个合法的 JSON 数组:
[
"张三",
18,
"男"
]
这也是一个合法的 JSON 数组:
[
{
"name" : "张三",
"age" : 18,
"sex" : "男"
},
{
"name" : "李四",
"age" : 19,
"sex" : "男"
}
]
1.5 JSON 值
值(value)可以是:
- 字符串:必须用双引号括起来
- 数 值:十进制整数或浮点数
- 对 象:键 / 值对的集合
- 数 组:值的集合
- 布尔值:true 或 false
- null
value 可以是简单的用双引号引起来的 string 串,也可以是一个数值;或布尔值(true or false),或 null。
当然也可以是复杂的 object 或 array,这些取值是可以嵌套的。
在「1.4 JSON 数组」中,第二个例子就是一个嵌套的举例,当然也可以这么嵌套:
{
"class_name" : "计科一班",
"student_num" : 2,
"student_info" :
[
{
"name" : "张三",
"age" : 18,
"sex" : "男"
},
{
"name" : "李四",
"age" : 19,
"sex" : "男"