cJSON库的使用(一)

1、JSON格式:一对大括号,相当于XML的头和尾,内部全是键值对

{
    "name" : "apple",
    "sex"  : "famale",
    "high" : "178",
    "girls":["alice", "ruby", "kit"],
    "家电" :{"TV":"changhong"}
}

注:结合JSON视图工具,可以把JSON数据结构化展示出来,清晰明了

1、一对大括号括起内容
2、内部使用key:value 
    key值为字符串
    value值可以取值:字符串、数值类型、数组类型[]、对象{}、NULL、布尔值

2、cJSON库

在GitHub上下载对应的cJSON库(cJson-master),注解码后内部只有cJSON.h和cJSON.c可以供我们使用,也就是直接使用cJSON的源码,用时把这两个文件拷到开发目录下即可

/*内部函数简介:*/
1、cJson_Parse(char*)  //用于解析利用C字符串存储的json字符串
    会生成一个cJSON格式的结构体
2、cJson_Print(cJson*) //用于输出json字符串解析后的数据
    把cJSON结构体转换成C字符串
3、cJson_Delete(cJson*)//释放cJson*类型数据

简单使用:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int main(void)
{
	char *data = "{\"love\":[\"LOL\", \"Go shopping\"]}";
	//解析data字符串,存储成cJSON结构体
	cJSON *json = cJSON_Parse(data);
	char *json_data = NULL;
	printf("data : %s\n", json_data = cJSON_Print(json));
	free(json_data);
	cJSON_Delete(json);
	return 0;
}

注:测试文件需要使用数学库,需要加入-lm

加数学库:-lm
注:不是-lmath
floor:向下取整
ceil:向上取整

3、基于JSON相关的C库函数,生成对应的json文件

注:快捷方式:[ + d:快速列出宏定义

<1>创建一个值类型的数据

注:不管什么类型的数据转换后都是cJSON结构体

extern cJSON* cJSON_CreateNumber(double num)
extern cJSON* cJSON_CreateString(const char *string)
extern cJSON* cJSON_CreateArray(void)

<2>创建一个对象(文档)

extern cJSON* cJSON_CreateObject(void); //创建json对象,相当于创建了一对{}

<3>数组创建及添加

cJSON* cJSON_CreateIntArray(const int *numbers, int count)
void cJSON_AddItemToArray(cJSON *array, cJSON *item)
//例子
cJSON* array = NULL;
cJSON_AddItemToArray(array, cJSON_CreateString("LOL"));
cJSON_AddItemToArray(array, cJSON_CreateString("NBA"));
cJSON_AddItemToArray(array, cJSON_CreateString("Shopping"));

4、JSON嵌套

<1>向对象中增加键值对

cJSON_AddItemToObject(root, "rows", 值数据类型的相关函数());

<2>在对象中增加数组

cJSON_AddItemToObject(root, "rows", cJSON_CreateArray());

<3>向数组中增加对象

cJSON_AddItemToArray(rows, cJSON_CreateObject());

<4>几个可以提高操作效率的宏函数

#define cJSON_AddNumberToObject(object, name, n) \
            cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object, name, s) \
            cJSON_AddItemToObejct(object, name, cJSON_CreateString(s))

<5>添加一个元素到json对象中:cJSON_AddItemToObject(json, "key", value)

value取值:
    字符串   ---》cJSON_CreateString("value");
    数值     ---》cJSON_CreateNumber(29);
    数组     ---》cJSON_CreateArray(void);
    对象     ---》cJSON_CreateObject(void);

5、json文件创建方法

    ----》json = cJSON_CreateObject(); //相当于创建一个大括号
    ----》cJSON_AddItemToObject(json, "name", cJSON_CreateString("hmh")) //json对象加元素
{    
    "name":"hmh", ---->cJSON_CreateString("hmh")
    "age":28,
}

6、创建json文件案例

注:gcc -o demo test2.c cJSON.* -lm

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "cJSON.h"
int main(void)
{
	//创建一个空的文档对象
	cJSON* json = cJSON_CreateObject();

	//向文档中增加一个键值对{"name":"hmh"}
	//======>cJSON_AddStringToObject(json, "name", "hmh")
	cJSON_AddItemToObject(json, "name", cJSON_CreateString("hmh"));
	cJSON_AddItemToObject(json, "age", cJSON_CreateNumber(29));

	cJSON* array = NULL;
	cJSON_AddItemToObject(json, "love", array = cJSON_CreateArray());
	cJSON_AddItemToArray(array, cJSON_CreateString("LOL"));
	cJSON_AddItemToArray(array, cJSON_CreateString("NBA"));
	cJSON_AddItemToArray(array, cJSON_CreateString("Shopping"));

	//宏的使用
	cJSON_AddNumberToObject(json, "score", 59);
	cJSON_AddStringToObject(json, "address", "beijing");

	//将json结构体格式化到缓冲区
	char *buf = cJSON_Print(json);

	//打开文件用以写入json数据
	FILE *fp = fopen("test2.json", "w");
	fwrite(buf, 1, strlen(buf), fp);
	free(buf);
	fclose(fp);

	//释放json结构体所占的内存
	cJSON_Delete(json);
	
	return 0;
}
发布了161 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42067873/article/details/104309534