cJson数组的生成与解析

cJson数组的生成与解析

cJosn官方源码地址:https://sourceforge.net/projects/cjson/

使用json偶尔会遇到数组,每次都要去查相关函数,去解析或者生成,在此做一次记录,方便以后使用。按照我自己的使用习惯,根据数组元素的不同,把数组分成了三种,一般数组,嵌套数组和元素为包含多条数据的json对象的数组。

生成相关函数

  1. 一般数组
/* These utilities create an Array of count items. */
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count);

以上函数用来生成一般数组,如cJSON_CreateIntArray函数,可以生成

[1, 2, 3, 4]

Float和Double以此类推,对于cJSON_CreateStringArray函数用来生成字符串数组,注意它的参数和其他函数是有区别的,生成的数组如下:

["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
  1. 嵌套数组
/* create a cJSON item of the appropriate type. */
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
/* Append item to the specified array/object. */
CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item);
CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);

cJSON_CreateArray函数生成一个数组对象,数组的元素是json对象,如上面一般数组本身也是一个json对象,所以可以把一般数组作为元素,通过cJSON_AddItemToArray函数添加到数组中。例如可以生成如下的json数据:

{
	"JsonArrs": [
		["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
		["sunny", "sunny", "cloudy", "overcast", "light rain", "moderate snow", "sunny"]
	]
}
  1. 值为数组,数组元素为包含多条数据的json对象
    由上文可知,cJSON_CreateArray函数生成一个数组对象,数组的元素是json对象,因此可以生成如下json数据:
{
	"ObjInfo": [{
		"name": "Tom",
		"id": "1000",
		"score": 98
	}, {
		"name": "Jack",
		"id": "1001",
		"score": 95
	}, {
		"name": "Emily",
		"id": "1002",
		"score": 90
	}]
}

解析相关函数

/* check the type of an item */
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
/* Returns the number of items in an array (or object). */
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
/* Get item "string" from object */
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);

cJSON_IsArray:判断item是否为数组
cJSON_GetArraySize:获取数组大小
cJSON_GetArrayItem:按索引获取数组元素
cJSON_GetObjectItem:根据key获取当前item的值

代码例程

以下代码生成json数据,并解析,先看一下json数据:

{
	"NumArr": [1, 2, 3, 4],
	"StrArr": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
	"JsonArrs": [
		["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
		["sunny", "sunny", "cloudy", "overcast", "light rain", "moderate snow", "sunny"]
	],
	"ObjInfo": [{
		"name": "Tom",
		"id": "1000",
		"score": 98
	}, {
		"name": "Jack",
		"id": "1001",
		"score": 95
	}, {
		"name": "Emily",
		"id": "1002",
		"score": 90
	}]
}

生成json代码

int JsonArrProduce(char * OutStr)
{
	int nRtn = 0;
	char 	*cjson_str = NULL;
	const int 	anNum[4] = {1, 2, 3, 4};
	const char	*achWeek[7] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
	const char	*achWeather[7] = {"sunny","sunny","cloudy","overcast","light rain","moderate snow","sunny"};

	cJSON 	*jsonroot = NULL;
	//新建一个JSON项目:jsonroot
    jsonroot = cJSON_CreateObject(); 
    if(NULL == jsonroot)
    {
        return 1;
    }
	//1. 新建一个JSON数组,每个元素是int型数据,整个数组是一个json对象
	cJSON * ArrNum = cJSON_CreateIntArray(anNum, 4);  
	//ArrNum加入到jsonroot
	cJSON_AddItemToObject(jsonroot, "NumArr", ArrNum);

	//2. 新建一个JSON数组,每个元素是char*型数据,整个数组是一个json对象
	cJSON * ArrStr = cJSON_CreateStringArray(achWeek, 7);  
	//ArrStr加入到jsonroot
	cJSON_AddItemToObject(jsonroot, "StrArr", ArrStr);

	//3. 新建一个json数组,每个元素是一个数组
	//3.1 创建字符串数组
	cJSON * ArrWeek = cJSON_CreateStringArray(achWeek, 7); 
	cJSON * ArrWthr = cJSON_CreateStringArray(achWeather, 7);  
	//3.2 添加字符串数组到json数组
	cJSON * JsonArrs = cJSON_CreateArray();
	cJSON_AddItemToArray(JsonArrs, ArrWeek);
	cJSON_AddItemToArray(JsonArrs, ArrWthr);
	//3.3 JsonArrs加入到jsonroot
	cJSON_AddItemToObject(jsonroot, "JsonArrs", JsonArrs);

	//4. 新建一个json数组,每个元素是一个对象
	//4.1 先生成每个对象
	cJSON * ObjFirst = cJSON_CreateObject();
	cJSON_AddStringToObject(ObjFirst, "name", "Tom");
	cJSON_AddStringToObject(ObjFirst, "id", "1000");
	cJSON_AddNumberToObject(ObjFirst, "score", 98);

	cJSON * ObjScnd = cJSON_CreateObject();
	cJSON_AddStringToObject(ObjScnd, "name", "Jack");
	cJSON_AddStringToObject(ObjScnd, "id", "1001");
	cJSON_AddNumberToObject(ObjScnd, "score", 95);

	cJSON * ObjThird = cJSON_CreateObject();
	cJSON_AddStringToObject(ObjThird, "name", "Emily");
	cJSON_AddStringToObject(ObjThird, "id", "1002");
	cJSON_AddNumberToObject(ObjThird, "score", 90);
	//4.2 把对象添加到数组
	cJSON * ObjArr = cJSON_CreateArray();
	cJSON_AddItemToArray(ObjArr, ObjFirst);
	cJSON_AddItemToArray(ObjArr, ObjScnd);
	cJSON_AddItemToArray(ObjArr, ObjThird);
	//4.3 ObjArr加入到jsonroot
	cJSON_AddItemToObject(jsonroot, "ObjInfo", ObjArr);

	//cjson_str = cJSON_PrintUnformatted(jsonroot);
	cjson_str = cJSON_Print(jsonroot);
	
	printf("jsonroot : \n%s\n", cjson_str);
	strcpy(OutStr, cjson_str);

	free(cjson_str);
	cJSON_Delete(jsonroot);
	return nRtn;
}

解析json代码

int JsonArrParse(char * InStr)
{
	int nRtn = 0;
	int i, j;
	int ArrLen = 0;
	int SubArrLen = 0;
	int nValue;
	char *pStr = NULL;

	cJSON* jsonroot = cJSON_Parse(InStr);

	//1. 解析数组成员为整形数据的数组ArrNum
	printf("*********************** ArrNum *************************\n");
	cJSON * ArrNum = cJSON_GetObjectItem(jsonroot,"NumArr");
	if (cJSON_IsArray(ArrNum))
	{
		//获取数组大小
		ArrLen = cJSON_GetArraySize(ArrNum);
		for (i = 0; i < ArrLen; i++)
		{
			//获取数组元素item
			cJSON * ArrNumEle = cJSON_GetArrayItem(ArrNum, i);
			if(NULL == ArrNumEle)
			{
			    continue;
			}
			//从item获取值
			nValue = ArrNumEle->valueint;
			printf("value[%d] : [%d]\n", i, nValue);
		}
	}

	//2. 解析数组成员为char*型数据的数组ArrStr
	printf("*********************** ArrStr *************************\n");
	cJSON * ArrStr = cJSON_GetObjectItem(jsonroot,"StrArr");
	if (cJSON_IsArray(ArrStr))
	{
		ArrLen = cJSON_GetArraySize(ArrStr);
		for (i = 0; i < ArrLen; i++)
		{
			cJSON * ArrStrEle = cJSON_GetArrayItem(ArrStr, i);
			if(NULL == ArrStrEle)
			{
			    continue;
			}
			pStr = cJSON_GetStringValue(ArrStrEle);
			printf("value[%d] : [%s]\n", i, pStr);
		}
	}

	//3. 解析数组成员是数组的数组JsonArrs
	printf("*********************** JsonArrs *************************\n");
	cJSON * JsonArrs = cJSON_GetObjectItem(jsonroot,"JsonArrs");
	if (cJSON_IsArray(JsonArrs))
	{
		//获取外围数组大小
		ArrLen = cJSON_GetArraySize(JsonArrs);
		printf("JsonArrs Len: %d\n", ArrLen);
		for (i = 0; i < ArrLen; i++)
		{
			//获取子数组item
			cJSON * SubArr = cJSON_GetArrayItem(JsonArrs, i);
			if (cJSON_IsArray(SubArr))
			{
				//获取子数组大小
				SubArrLen = cJSON_GetArraySize(SubArr);
				printf("[%d]SubArrLen Len: %d\n", i, SubArrLen);
				for (j = 0; j < SubArrLen; j++)
				{
					cJSON * ArrStrEle = cJSON_GetArrayItem(SubArr, j);
					if(NULL == ArrStrEle)
					{
						continue;
					}
					pStr = cJSON_GetStringValue(ArrStrEle);
					printf("value[%d] : [%s]\n", j, pStr);
				}
			}
			
		}
	}

	//4. 解析数组成员是json对象的数组ObjArr
	printf("*********************** ObjArr *************************\n");
	cJSON * ObjArr = cJSON_GetObjectItem(jsonroot,"ObjInfo");
	if (cJSON_IsArray(ObjArr))
	{
		ArrLen = cJSON_GetArraySize(ObjArr);
		printf("ObjArr Len: %d\n", ArrLen);
		for (i = 0; i < ArrLen; i++)
		{
			cJSON * SubObj = cJSON_GetArrayItem(ObjArr, i);
			if(NULL == SubObj)
			{
				continue;
			}
			printf("[%d]name:%s\tid:%s\tscore:%d\n", i, \
				cJSON_GetObjectItem(SubObj, "name")->valuestring, \
				cJSON_GetObjectItem(SubObj, "id")->valuestring, \
				cJSON_GetObjectItem(SubObj, "score")->valueint);
		}
	}

	cJSON_Delete(jsonroot);
	return nRtn;
}

main函数

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

/*
cjson 数组生成与解析
2021年1月5日
以前吃不胖丶
*/

int main()
{
	int nRtn = 0;
	char abyBuf[1024] = {0};
	
	nRtn = JsonArrProduce(abyBuf);

	printf("\n----------------------------------------------------------------\n\n");

	nRtn = JsonArrParse(abyBuf);

	return nRtn;
}

以上代码中都有详细注释,有疑问的欢迎留言讨论,编译后运行结果如下,这里有点疑问,按照格式化打印,嵌套数组没有格式化,不过影响不大。

jsonroot : 
{
        "NumArr":       [1, 2, 3, 4],
        "StrArr":       ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
        "JsonArrs":     [["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["sunny", "sunny", "cloudy", "overcast", "light rain", "moderate snow", "sunny"]],
        "ObjInfo":      [{
                        "name": "Tom",
                        "id":   "1000",
                        "score":        98
                }, {
                        "name": "Jack",
                        "id":   "1001",
                        "score":        95
                }, {
                        "name": "Emily",
                        "id":   "1002",
                        "score":        90
                }]
}

----------------------------------------------------------------

*********************** ArrNum *************************
value[0] : [1]
value[1] : [2]
value[2] : [3]
value[3] : [4]
*********************** ArrStr *************************
value[0] : [Sunday]
value[1] : [Monday]
value[2] : [Tuesday]
value[3] : [Wednesday]
value[4] : [Thursday]
value[5] : [Friday]
value[6] : [Saturday]
*********************** JsonArrs *************************
JsonArrs Len: 2
[0]SubArrLen Len: 7
value[0] : [Sunday]
value[1] : [Monday]
value[2] : [Tuesday]
value[3] : [Wednesday]
value[4] : [Thursday]
value[5] : [Friday]
value[6] : [Saturday]
[1]SubArrLen Len: 7
value[0] : [sunny]
value[1] : [sunny]
value[2] : [cloudy]
value[3] : [overcast]
value[4] : [light rain]
value[5] : [moderate snow]
value[6] : [sunny]
*********************** ObjArr *************************
ObjArr Len: 3
[0]name:Tom     id:1000 score:98
[1]name:Jack    id:1001 score:95
[2]name:Emily   id:1002 score:90
  • 27
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Cjson 是一个用于处理 JSON 数据的库,它提供了一些函数来进行 JSON 数据的解析生成。在 Cjson 中,可以通过函数 cJSON_Parse() 将一个 JSON 字符串解析为一个 cJSON 对象,而 cJSON_Print() 函数可以将一个 cJSON 对象转换为一个 JSON 字符串。 以下是一个示例代码,展示了如何在 Cjson 中进行数组字符串的互转: ```c #include <stdio.h> #include <stdlib.h> #include "cJSON.h" int main() { // 创建一个 JSON 数组 cJSON *array = cJSON_CreateArray(); // 向数组中添加字符串元素 cJSON_AddItemToArray(array, cJSON_CreateString("element1")); cJSON_AddItemToArray(array, cJSON_CreateString("element2")); cJSON_AddItemToArray(array, cJSON_CreateString("element3")); // 将数组转换为 JSON 字符串 char *jsonStr = cJSON_Print(array); printf("JSON String: %s\n", jsonStr); // 解析 JSON 字符串为 cJSON 数组 cJSON *parsedArray = cJSON_Parse(jsonStr); // 遍历数组并打印每个元素 int arraySize = cJSON_GetArraySize(parsedArray); for (int i = 0; i < arraySize; i++) { cJSON *element = cJSON_GetArrayItem(parsedArray, i); printf("Element %d: %s\n", i, element->valuestring); } // 释放内存 free(jsonStr); cJSON_Delete(array); cJSON_Delete(parsedArray); return 0; } ``` 以上代码中,我们首先创建了一个 cJSON 数组,并向数组中添加了三个字符串元素。然后,我们使用 cJSON_Print() 函数将该数组转换为 JSON 字符串,并打印出来。接着,我们使用 cJSON_Parse() 函数将该 JSON 字符串解析为一个 cJSON 数组。最后,我们遍历该数组并打印出每个元素的值。 请注意,在使用 cJSON 库之前,你需要先下载并编译该库。你可以从 cJSON 的官方网站(https://github.com/DaveGamble/cJSON)下载该库的源代码,并根据其提供的文档进行编译和安装。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值