一、JOSN的概念:
- json指的是JavaScript对象表示法(JavaScript Object Notation)
- josn是轻量级的文本数据交换格式
- json独立于语言
- json具有自我描述性,更易理解
json 使用 JavaScript 语法来描述数据对象,但是 json 仍然独立于语言和平台。json 解析器和 json 库支持许多不同的编程语言。
json的语法规则
json语法简单来说就是四条
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数据
json名称/值对
josn数据的书写格式是:名称:值,这样的一对,即名称在前,该名称的值在冒号后面。例如:
“virteNBName”:“virt1”
这里的名称是“virteNBName”,值是“virt1”,他们均是字符串
名称和值的类型可以有以下几种:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true或false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
json数据由逗号分隔
“virteNBName”:“virt1”, “virteNBNum”:5, “begineNBID”:0这几个对象之间就是使用逗号分隔。
数组内的对象之间当然也是要有逗号分隔。只要是对象之间,分隔就是用逗号,但是,要注意,对象结束的时候,不要加逗号。数组内也是,例如:
[
{"eRANName":"eNB1", "eRANID":3002, "ctlPort":36412, "dataPort":2152},
{"eRANName":"eNB2", "eRANID":10000, "ctlPort":36412, "dataPort":2152},
]
上面这个就是错误的,因为在数组中,两个对象之间需要逗号,但是到这个数组末尾了,不需要加逗号了。
josn花括号保存对象
对象可以包含多个名称/值对,如
{“eRANName”:“eNB1”, “eRANID”:3002, “ctlPort”:36412, “dataPort”:2152}
这一点也容易理解,与这条JavaScript语句等价:
“eRANName” = “eNB1”
“eRANID” = 3002
“ctlPort” = 36412
“dataPort” = 2152
josn方括号保存数组
数组可包含多个对象:
"eRAN":[
{"eRANName":"eNB1", "eRANID":3002, "ctlPort":36412, "dataPort":2152},
{"eRANName":"eNB2", "eRANID":10000, "ctlPort":36412, "dataPort":2152}
]
在上面的例子中,对象“eRAN” 是包含个对象的数组,每个对象代表一条基站的记录。
最后我们要知道json文件的类型为“.json”
二、cjosn的介绍
cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。
那么我们为什么选择cJSON来解析JSON字符串那?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.C文件和一个.h文件!并且文件体积大小不到K。源码思路也非常清晰,也非常适合研究。
我们可以通过此链接下载cJOSN:https://sourceforge.net/projects/cjson/
当我们下载好cJSON只需要把.C文件和.h文件包含文件拷贝到我们工程目录下,我们就可以使用了。
cJSON的核心结构体就是一个cJSON,理解了这个结构体,基本上对cJSON的使用就有了个基本概念了,该结构体具体定义如下:
typedef struct cJSON {
struct cJSON*next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/
struct cJSON *child; /*数组或对象的孩子节点*/
int type; /* key的类型*/
char *valuestring; /*字符串值*/
int valueint; /* 整数值*/
double valuedouble; /* 浮点数值*/
char *string; /* key的名字*/
} cJSON;
说明:
-
cJSON是使用链表来存储数据的,其访问方式很像一棵树。每一个节点可以有兄弟节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。只有节点是对象或数组时才可以有孩子节点。
-
type是键(key)的类型,一共有种取值,分别是:False,True,null,Number,String,Array,Object。
若是Number类型,则valueint或valuedouble种存储着值,如期望的是int,则访问valueint,如期望的是double,则访问valuedouble,可以得到值。
若是String类型的,则valuestring中存储着值,可以访问valuestring得到值。 -
string中存放的是这个节点的名字,可以理解位key的名称。
三、 cJSON常用函数简介
1、cJSON *cJSON_CreateObject();
创建一个json对象,返回一个cJSON结构体类型的指针。
2、cJSON *cJSON_CreateArray();
创建一个数组对象,返回一个cJSON结构体类型的指针。
3、cJSON *cJSON_CreateString(const char *string);
创建一个字符串对象,传入一个char *类型的字符串,返回一个cJSON结构体类型的指针。
4、void cJSON_AddItemToArray(cJSON *array, cJSON *item);
向数组对象中添加一个元素,传入参数array为cJSON *结构体类型的指针&#