【cJSON库】cJSON库的使用
版权声明:本文为博主原创文章,转载请注明出处。 https://www.cnblogs.com/YaoYing/p/12868648.html
cJSON库的使用
1、下载和安装
下载完成后解压缩,只需要将cJSON.c和cJSON.h文件和自己的工程一起编译即可。
2、cJSON语法
JSON三种语法:
键/值对key:value,用半角冒号分割。比如"name":"Jack"
JSON对象写在花括号中,可以包含多个键/值对。比如{"width":1920,"height":1080}
JSON数组写在方括号中,数组成员可以是对象、值,也可以是数组(只要有意义)。比如{"week":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]}
JSON的值可以是:数字Number(整数或浮点数)、字符串String(在双引号中)、逻辑值(Ture或False)、数组Array(在方括号中)、对象Object(在花括号中)、NULL
JSON两种结构:
复杂的数据结构都是由对象和数据组成的
对象:对象在js中表示为“{}”括起来的内容,数据结构为{key:value...}的键值对的结构,在面向对象的语言中,对象直接调用对象的属性来回去属性的值。key为对象的属性,value为对应的属性值,取值方法为对象.key获取属性值
数组:数组在js中是中括号“[]”括起来的内容,数据结构为["Sunday","Monday","Tuesday",...],取值方式利用数据下标索引
3、cJSON结构体
typedef struct cJSON
{
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *next; //遍历数组或对象链的后向链表指针
struct cJSON *prev; //遍历数组或对象链的前向链表指针
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
struct cJSON *child; //数组或对象链的孩子节点
/* The type of the item, as above. */
int type; //key的类型
/* The item's string, if type==cJSON_String and type == cJSON_Raw */
char *valuestring; //字符串值
/* The item's number, if type==cJSON_Number */
int valueint; //整数值
/* The item's number, if type==cJSON_Number */
double valuedouble; //浮点数值
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
char *string; //key的名字
} cJSON;
4、生成cJSON常用函数
cJSON cJSON_CreateObject(void);
功能:创建根对象
参数:无
返回值:生成一个cJSON对象指针
cJSON cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
功能:往根指针里面添加cJSON对象
参数:object:新获取的根对象
string:key的名字
item:key的对象
返回值:key的对象指针
cJSON_AddStringToObject(object,name,s);
功能:给key对象赋值
参数:*objec:需赋值的key对象
name:key的名字
s:key的值
返回值:无
cJSON *cJSON_Print(const cJSON *item);
功能:将json对象转换成普通的字符串
参数:item:创建的根对象根指针
返回值:普通字符串指针
cJSON_Delete(cJSON *c)
功能:用来释放所占内存
参数:c:获取的句柄
返回值:无
5、解析cJSON常用函数
cJSON *cJSON_Parse(const char *value);
功能:解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。
参数:value:需解析的字符串
返回值:获取一个句柄
cJSON *cJSON_GetObjectItem(const cJSON *object, const char *string);
功能:获取json指定的对象成员
参数:*objec:第一个函数中获取的句柄。
string:需要获取的对象
返回值:这个对象成员的句柄 如果json格式的对象成员直接就是字符串那么就可以直接通过结构体中的valuestring元素来获取这个成员的值
cJSON *cJSON_GetArrayItem(const cJSON *array, int item);
功能:有可能第二个函数中获取到的是成员对象值是一个数组,那么就需要用到这个函数。用来获取这个数组指定的下标对象
参数:*array:传入第二步中返回的值
item:想要获取这个数组的下标元素
返回值:这个数组中指定下标的对象。然后在对这个返回值重复使用第二步函数就可以获取到各个成员的值了。
也就是说对象是数组的比是字符串的要多用一个cJSON_GetArrayItem函数,其他的没区别。
cJSON_Delete(cJSON *c)
功能:用来释放所占内存
参数:c:获取的句柄
返回值:无
6、编译和执行
在Linux命令行使用cJSON库还需要加上-lm链接math库
gcc test.c cJSON.c -o test -lm
7、相关问题
cJSON_PrintUnformatted()和cJSON_Print()的区别
相同点:
功能都是将json对象转换成普通的字符串
不同点:
只是转换的格式不同
cJSON_PrintUnformatted:转换后是无格式的,字符串中间不会有"\n""\t";
cJSON_Print:转换后打印出来是人看起来很舒服的格式;
更新日期20200511
如有错误之处,请评论或者私信指出,非常感谢