本文主要讲述对于c-json部分api的作用
C下面的json字符串格式(直接写在程序里面,\是用来转义"的)(此处格式必须正确,否则后面解析会出问题):
在C语言中json串说白了就是字符串,用字符数组存储,在解析过程中将自己要解析的json串传入cJSON_Parse(value)函数,即可 解析;
cJSON_Parse(value)函数直接调用了cJSON_ParseWithOpts(value,0,0)函数,在这个函数里面开始初始化parse_buffer结构体(我们的json串就存放在这个结构体元素content里面),申请一个cJSON节点,作为我们后续按键查值等各种操作的操作节点(并非存储数据节点,真正的存储数据节点是以cJSON->child为头结点的链表,通过cJSON->child->next遍历)
cJSON_ParseWithOpts(value,0,0)函数调用真正的json解析函数parse_value(item,input_buffer)(将json数据解析后存入item->child为首的链表);
parse_value()函数对json串进行格式校验并依据字符进行解析, 在存储json串进入cJSON链表时,将键存入了cJSON结构体元素string里面,将值存入了结构体元素valuestring里面;
解析字符:
"(引号) : parse_string(); //键和值必须是用引号引起来的,嵌套json除外
-和0到9的数字: parse_number();
[(左中括号) : parse_array(); //嵌套json,中括号内的东西作为冒号前面键的值
{(左大括号) : parse_object(); //json串基本上以这个字符开始
因为json串属于嵌套类型的字符串格式,上述四个函数会循环调用,不要乱,找一个json串,按照键:值对方式跟着去解析就能明了;
四个打印函数:cJSON_Print()、cJSON_PrintUnformatted()、cJSON_PrintBuffered()、cJSON_PrintPreallocated(),需要定义char *指针承接返回值,返回值为打印内容首地址;四个函数传参、打印格式不一样,未细致研究;
cJSON_Delete()函数为释放链表,删除节点函数,函数结束时要记得调用此函数释放申请的内存;
函数cJSON_GetArraySize()会获取当前链表节点个数,节点个数对应为多少个键值对;
函数cJSON_GetArrayItem(array,index)提供按数组元素方式访问具体存储某一个键值对的节点(如有5个键值对存入链表,则可以访问0-4的节点位置,对应具体的键值对);
因为json串中的键具有唯一性,函数cJSON_GetObjectItem(object,string)提供按照键的内容查询到具体某一个节点(键值对)的信息,包含一个不区分大小写的功能;
函数cJSON_GetObjectItemCaseSensitive()函数与上一个按键的内容查询具体节点信息的功能类似,只不过少了一个不区分大小写的功能;
函数cJSON_HasObjectItem()功能是检测cJSON_GetObjectItem(object,string)函数返回是否成功,本函数成功返回1,失败返回0;(用了一个三目运算符)
函数cJSON_GetErrorPtr()能够获取解析失败的报错信息;(未测试)