c-json源码分析

本文主要讲述对于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(iteminput_buffer)(json数据解析后存入item->child为首的链表)

 parse_value()函数对json串进行格式校验并依据字符进行解析, 在存储json串进入cJSON链表时,将键存入了cJSON结构体元素string里面,将值存入了结构体元素valuestring里面;

解析字符:

 "(引号) parse_string(); //键和值必须是用引号引起来的,嵌套json除外

 -09的数字: 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()能够获取解析失败的报错信息;(未测试)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值