C语言解析JSON格式数据

源码地址icon-default.png?t=N7T8https://download.csdn.net/download/qq_53683175/88956229

1. 介绍

cJSON 一个基于 C 语言的 Json 库,它是一个开源项目,便于开发和移植。

2.创建和解析一个简单的 JSON 数据

2.1 创建 一个简单的 JSON 数据

创建一个如下的JSON数据:

{
    "name":"杨过",
    "year":999,
    "isMan":true,
    "height":180.99
}

源码:

int main()
{
	//1. 创建cJSON对象
	cJSON *jsonData = cJSON_CreateObject();

    //2. 创建数据
	cJSON_AddStringToObject(jsonData, "name","杨过");
	cJSON_AddNumberToObject(jsonData,"year",666);
	cJSON_AddBoolToObject(jsonData, "isMan", cJSON_True);
	cJSON_AddNumberToObject(jsonData, "heigh", 180.99);

	//3. 打印生成的结果
	char *data = cJSON_PrintUnformatted(jsonData);
	printf("%s\r\n",data);

	data = cJSON_Print(jsonData);
	printf("\r\n%s\r\n",data);

	//4. 释放空间
	cJSON_Delete(jsonData);
	return 0;
}

测试结果:

2.2 解析 一个简单的SON 数据

源码:

int main()
{
    char data[] = "{\"name\":\"杨过\",\"year\":666,\"isMan\":true,\"heigh\":180.99}";
    //1. 载入JSON数据
	cJSON* jsonData = cJSON_Parse(data);
	if (jsonData == NULL)
        return 0;

	//2. 解析字段
	cJSON* item;

	item = cJSON_GetObjectItem(jsonData,"name");
	if (item)
	{
		printf("name = %s\n", item->valuestring);
	}

	item = cJSON_GetObjectItem(jsonData, "year");
	if (item)
	{
		printf("year = %d\n", item->valueint);
	}

	item = cJSON_GetObjectItem(jsonData, "isMan");
	if (item)
	{
		printf("isMan = %d\n", item->valueint);
	}

	item = cJSON_GetObjectItem(jsonData, "heigh");
	if (item)
	{
		printf("heigh = %lf\n", item->valuedouble);
	}

	//3. 释放空间
	cJSON_Delete(jsonData);

	return 0;
}

测试结果:

3. 创建和解析具有多个对象的 JSON 数据

3.1 创建具有多个对象的 JSON 数据

创建如下一个 JSON 数据

{
    "male": {
        "name":"杨过",
        "year":999
    },
    "female": {
        "name":"小龙女",
        "year":666
    }
}

源码:

int main()
{
	//1. 创建cJSON对象
	cJSON *jsonData = cJSON_CreateObject();

    //2.1 创建数据 male
	cJSON* male = cJSON_CreateObject();
	cJSON_AddStringToObject(male, "name","杨过");
	cJSON_AddNumberToObject(male,"year",999);
	cJSON_AddItemToObject(jsonData, "male", male);

    //2.2 创建数据 female
	cJSON* female = cJSON_CreateObject();
	cJSON_AddStringToObject(female, "name","小龙女");
	cJSON_AddNumberToObject(female,"year",666);
	cJSON_AddItemToObject(jsonData, "female", female);

	//3. 打印生成的结果
	char *data = cJSON_PrintUnformatted(jsonData);
	printf("%s\r\n",data);

	data = cJSON_Print(jsonData);
	printf("\r\n%s\r\n",data);

	//4. 释放空间
	cJSON_Delete(jsonData);
	return 0;
}

测试结果:

3.2 解析具有多个对象的 JSON 数据

源码:

int main()
{
    char data[] = "{\"male\":{\"name\":\"杨过\",\"year\":999},\"female\":{\"name\":\"小龙女\",\"year\":666}}";
    //1. 载入JSON数据
	cJSON* jsonData = cJSON_Parse(data);
	if (jsonData == NULL)
        return 0;

	//2. 解析字段
	cJSON* item;

	item = cJSON_GetObjectItem(jsonData, "male");
	if (item){
		cJSON *obj = cJSON_GetObjectItem(item, "name");
        if (obj){
			printf("male.name = %s\n", obj->valuestring);
		}
		obj = cJSON_GetObjectItem(item, "year");
		if (obj)
		{
			printf("male.year = %d\n", obj->valueint);
		}
	}

	item = cJSON_GetObjectItem(jsonData, "female");
	if (item){
		cJSON *obj = cJSON_GetObjectItem(item, "name");
        if (obj){
			printf("female.name = %s\n", obj->valuestring);
		}
		obj = cJSON_GetObjectItem(item, "year");
		if (obj)
		{
			printf("female.year = %d\n", obj->valueint);
		}
	}

	//3. 释放空间
	cJSON_Delete(jsonData);
	return 0;
}

测试结果:

4. 创建和解析具有数组的 JSON 数据

4.1 创建具有数组的 JSON 数据

创建如下一个 JSON 数据

{
    "player": [
		{
			"name":"杨过",
			"year":999
		}, 
		{
			"name":"小龙女",
			"year":666
		}, 
		{
			"name":"郭靖",
			"year":333
		}
	]
}

源码:

typedef struct _Players{
    char Name[10];
    int year;
}Players;

int main()
{
    Players players[3] = {
        {"杨过", 999},
        {"小龙女", 666},
        {"郭靖", 333}
    };
	//1. 创建cJSON对象
	cJSON *jsonData = cJSON_CreateObject();

    //2. 创建数组对象
	cJSON *player = cJSON_CreateArray();
	cJSON_AddItemToObject(jsonData, "player", player);

    for(int i=0; i<3 ; i++){
		cJSON *obj = cJSON_CreateObject();
		cJSON_AddItemToArray(player, obj);

		cJSON *name = cJSON_CreateString(players[i].Name);
		cJSON_AddItemToObject(obj, "name", name);

		cJSON *year = cJSON_CreateNumber(players[i].year);
		cJSON_AddItemToObject(obj, "year", year);
    }

	//3. 打印生成的结果
	char *data = cJSON_PrintUnformatted(jsonData);
	printf("%s\r\n",data);

	data = cJSON_Print(jsonData);
	printf("\r\n%s\r\n",data);

	//4. 释放空间
	cJSON_Delete(jsonData);

	return 0;
}

测试结果:

4.2 解析具有数组的 JSON 数据

源码:

int main()
{
    char data[] = "{\"player\":[{\"name\":\"杨过\",\"year\":999},{\"name\":\"小龙女\",\"year\":666},{\"name\":\"郭靖\",\"year\":333}]}";
    //1. 载入JSON数据
	cJSON* jsonData = cJSON_Parse(data);
	if (jsonData == NULL)
        return 0;

	//2. 解析字段
	cJSON* player = cJSON_GetObjectItem(jsonData, "player");
	if (player){
        //2.1 获取数组的大小
		int Size = cJSON_GetArraySize(player);
		//2.2 解析数组的里的每个成员
		for (int i = 0; i < Size; i++){
			// 取出数组下标对象
			cJSON *array_item = cJSON_GetArrayItem(player, i);
			if (array_item == NULL)continue;

			// 解析数据
			cJSON *obj = cJSON_GetObjectItem(array_item, "name");
			if (obj){
				printf("player[%d].name = %s\n", i, obj->valuestring);
			}
			obj = cJSON_GetObjectItem(array_item, "year");
			if (obj){
				printf("player[%d].year = %d\n", i, obj->valueint);
			}
		}
	}

	//3. 释放空间
	cJSON_Delete(jsonData);

	return 0;
}

测试结果:

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值