cJson数组的生成与解析 您所在的位置:网站首页 数组添加数组 cJson数组的生成与解析

cJson数组的生成与解析

2023-09-12 04:13| 来源: 网络整理| 查看: 265

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 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 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 //获取子数组大小 SubArrLen = cJSON_GetArraySize(SubArr); printf("[%d]SubArrLen Len: %d\n", i, SubArrLen); for (j = 0; j 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 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 #include #include #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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有