什么是json?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成(一般用于提升网络传输速率)。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
JSON大致3种结构,JSON对象、JSON数组和JSON对象和数组嵌套。
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;
说明:
1、cJSON是使用链表来存储数据的,其访问方式很像一颗树。每一个节点可以有兄弟节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。只有节点是对象或数组时才可以有孩子节点。
2、type是键(key)的类型,一共有7种取值,分别是:False,Ture,NULL,Number,String,Array,Object。
若是Number类型,则valueint或valuedouble中存储着值。若期望的是int,则访问valueint,若期望的是double,则访问valuedouble,可以得到值。
若是String类型的,则valuestring中存储着值,可以访问valuestring得到值。
3、string中存放的是这个节点的名字,可理解为key的名称。
JSON的格式
键/值对 key:value,用半角冒号分割。 比如 “name”:“Li”
对象 JSON对象写在花括号中,可以包含多个键/值对。比如{ “name”:“Li” ,“address”:“湖北” }。
数组 JSON 数组在方括号中书写: 数组成员可以是对象,值,也可以是数组(只要有意义)。 {“city”: [“武汉”,“广州”,“北京”,“重庆”,“襄阳”]}
JSON对象
JSON对象简单而言便是键值对或名值对,而“值”可以是数值、字符串和布尔类型等
对象在json中表示为“{}”括起来的内容,数据结构为{key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值
1.1 JSON数值
数值不需要加引号,键值对之间使用","。
【单个数值】
{“value”:12}
【多个数值】
{
“maxValue”:24 ,
“minValue”:12
}
1.2 JSON字符串
字符串需要加引号,键值对之间使用","。
【单个字符串】
{“city”:“guangzhou”}
【多个字符串】
{
“city”:“guangzhou” ,
“province”:“guangdong”
}
1.3 JSON布尔
JSON格式中的值可以使用布尔类型,且不需要加引号,如果true或false被引号包裹,那么便解析为JSON字符串。
{“success”:false}
JSON数组
JSON数组的表达方法和C语言数组的表达方法完全相同。数组(在方括号[ ]中)
{“lists”:[5,6,7,8]}
JSON嵌套
JSON格式可以嵌套,所谓嵌套便是JSON对象中可包括JSON数组,JSON数组中可包括JSON对象。
{ “province1”: “广东” ,
“province2”: “湖北” ,
“湖北” : {
“简称” : “鄂”,
“省会” : “武汉” ,
“city” : [“襄阳”,“宜昌”,“恩施”]
}
}
cjson函数的使用
创建一个json对象
cJson * cJson_CreateObject(void);
创建一个json数组
cJSON *cJSON_CreateArray(void);
往json对象中添加数据成员
void cJson_AddltemToObject(
cJson *object, //json对象
cosnt char *string, //key值
cJson *item //value值(int,string,array,obj)
);
往json数组中添加数据成员
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
向数组对象中添加一个元素,传入参数array为cJSON *结构体类型的指针,为数组对象; item为添加的内容的对象指针。
解析出JSON结构
cJSON *cJSON_Parse(const char *value);
解析一块JSON数据返回cJSON结构,在使用完之后调用cJSON_Delete函数释 放json对象结构
将传入的JSON结构转化为字符串
char *cJSON_Print(cJSON *item);
(可用于输出到输出设备),使用完之后free(char *);
将JSON结构所占用的数据空间释放
cJSON *cJSON_CreateObject(void);
创建一个值类型的数据
cJSON *cJSON_CreateNumber(double num);
cJSON *cJSON_CreateString(const char *string);
cJSON *cJSON_CreateArray(void);
例如:
cJSONroot=cJSON_CreateObject(); //创建一个json对象
cJSON item=cJSON_CreateString(“Brett”); //由一个字符串生成一个cJSON的数据项
cJSON_AddItemToObject(root,“firstName”,item); //将上面生成的数据项和键值"firstname"一起添加道root对象里面去
这样就创建了一个cjson对象
向对象中添加键值对
cJSON_AddItemToObject(root, "keyvalue", 值类型数据相关函数());
keyvalue为键值
向对象中添加数组
cJSON_AddItemToObject(root, "keyvalue", cJSON_CreateArray());