最近在做项目的时候遇到了JSON格式的数据。需要对Json格式的数据进行解析,而我所使用的设备是嵌入式单片机,因此需要借助cJson来将Json和C语言结合起来。这篇文章就是我对Json和cJson相关内容知识的一个总结。
文章目录
1 JSON的介绍
1.1 JSON产生的原因
首先,JSON为什么出现。Json是一种人们规定的数据交换格式。在现实生活中,我们需要进行数据交换的情景非常多,但是许多情况下,由于各个设备所采用的语言、架构不同,因此一个设备内部的数据、变量、结构体、对象等不能被其他设备所识别,这就好像一个中国人需要的数字格式是一、二、三,一个英国人需要的数字格式是one、two、three,这两个人是无法进行正常的数据交换的。
那么这个时候如果我们把我们所需要交换的数据,通过某种固定的格式,变成大家都能识别的语言,这样的话,数据的交换只交换大家都能识别的语言,每个设备就不需要考虑数据交换的对方的语言,而只需要对要交换的数据按照约定的格式进行打包和解析。就像中国人和英国人只需要各自将数字转化为1、2、3的格式,或者将1、2、3格式的数字转化为各自所需要的语言格式,这样两个人就能正常交流了。
1.2 JSON的格式
那么我们已经知道了Json产生的原因,那么一个Json具体是什么样的呢?网上很多文章都提到了JSON的键、键值、数组等等,这样看起来JSON也很复杂,难以理解。其实我们抓住本质来说,JSON首先是一个纯的文本(字符串)。因为JSON是需要在各个编程语言中都能存在的,因此JSON的本质就是一堆文本。只不过因为这种文本为了方便打包和解析,我们定义了具体的写法和结构,因此我们可以给出定义:用于数据交换的、采用这种写法的、字符串、就叫JSON。
那么具体来说JSON是采用怎样的写法呢?也就是说,JSON的结构是什么。要弄清楚这个,首先我们要有一定的编程基础,知道在我们常用的语言中,例如C、C++、Java等,变量的种类都有什么。因为JSON的目的是将一个设备中的变量告诉给另个一设备,所以首先我们要知道我们需要在JSON中表达出来的变量的类型都有什么。然后当我们知道了我们需要表达的类型,我们再去知道通过什么样的格式来将变量构造成文本。
那么在常用的语言中,变量的种类基本上可以分为两种(这里我们不是讨论变量的具体形式例如整形、浮点型,而是谈论变量的表达方法),一种是对象,一种是数组。一个对象具有属性,每个属性又有该属性的属性值。例如某同学是一个对象,该同学具有的属性有姓名,年龄等,每个属性有其对应的属性值,“小明”、“15”,属性值可以是数值、字符串、数组、对象等形式。
那么我们如何把上述的对象转化为JSON格式的文本呢?
//实际交换时的JSON数据
{"student": { "name": "小明","age":15}}
//便于阅读的JSON数据
{
"student":
{
"name": "小明",
"age":15
}
}
入上图所示,“student”:表示对象,{ }表示对象的内容,对象内容里
"name"表示属性,“:”后面跟的是属性值,“,”表示并列的属性。通过这样的文本我们就将一个对象转化为了JSON数据,从而能够进行数据交换。
之前我们介绍到,数据的类型还有数组的形式,同样举例来说,加入我们现在面向整个班级,每个班级的学生都是一个对象,这么多个对象在一起组成一数组,这个数组就是我们所说的班级,那么如何把一个班的数据转化为JSON格式呢?
//实际交换时的JSON数据
{"class":{"class_number":1,"students":[{"name": "小明","age":15},{"name": "小红","age":14}, {"name": "小强","age":14}]}}
//便于阅读的JSON数据
{
"class":
{
"class_number":1,
"students":[
{
"name": "小明",
"age":15
},
{
"name": "小红",
"age":14
},
{
"name": "小强",
"age":14
}]
}
}
这里通过“[ ]”来表达数组。
总结来说,
1.首先一个JSON格式的文本以“{ }”为开头和结尾。
2.“{ }”内的为该对象所包含的属性。
3.属性加“ : ”的后面是该属性的属性值。
4.“,”表示相同对象中的不同属性,或相同数组里的不同个体。
5.“[ ]”表示数组。
6.数组和对象的区别在于,数组的成员是具有属性的不同个体,而对象的成员的是不同属性。
通过这种文本架构,我们就能将许多变量转化为我们所需要的JSON格式来进行数据交换。
到这里我们已经基本上对于JSON有了一个了解。此外补充几点,因为JSON的这种格式其实是在javascript中延伸出来的,可以存储Javascript复合对象,因此在这类平台中使用较为方便。
这里介绍一个网站可以进行JSON的数据在线解析。
https://www.json.cn/
以及JSON的说明网站
http://www.json.org/
2 cJSON的介绍
2.1 什么是cJSON,什么是cJSON结构体
接下来我们来将目光转向cJson。
Json在C语言中的使用存在一个问题,那就是C语言是一种面向过程的语言,和其他语言不同,因此C语言中没有对象等定义。那么Json在C语言的平台的使用过程中,就需要进行一些独属于C语言的解析和打包方法,这种基于C语言的JSON的处理方法我们称之为cJson。
目前已经有别人写好的cJSON的开源代码供我们使用,这样我们就不用花时间在造轮子上,而只需要学会如何取使用。因此接下来我们重点介绍cJSON的使用。
首先我们要在工程里包括cJson.c和cJson.h文件。这两个文件可以在网上自己找。或者我的下载里也有。
然后我们先从cJson结构体来入手,了解如何用C语言打包一个Json和如何用C语言解析一个Json。
上文所说。C语言没有对象这一概念,因此我们定义了一个结构体,我们称这个结构体为cJson结构体,从而将对象转化为了CJSON格式的结构体。从而在C语言中,我们打包或者解析一个JSON,经历的步骤为:需要打包的变量<——>cJson结构体<——>Json文本
从.h文件我们可以找到一个cJson结构体的形式:
typedef struct cJSON {
struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
int type; /* The type of the item, as above. */
char *valuestring; /* The item's string, if type==cJSON_String
2911



被折叠的 条评论
为什么被折叠?



