cJson数组的生成与解析
cJosn官方源码地址:https://sourceforge.net/projects/cjson/
使用json偶尔会遇到数组,每次都要去查相关函数,去解析或者生成,在此做一次记录,方便以后使用。按照我自己的使用习惯,根据数组元素的不同,把数组分成了三种,一般数组,嵌套数组和元素为包含多条数据的json对象的数组。
生成相关函数
- 一般数组
/* 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"]
- 嵌套数组
/* 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"]
]
}
- 值为数组,数组元素为包含多条数据的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