中级会员
 
- 积分
- 360
- 金钱
- 360
- 注册时间
- 2017-10-10
- 在线时间
- 131 小时
|
发表于 2020-12-8 14:39:56
|
显示全部楼层
本帖最后由 YukawaManabu 于 2020-12-8 15:07 编辑
代码大致这么个思想,随手写的。。。没试过编译会不会报错
然后内存分配和释放有个坑就是,如果根节点的对象 的内存被释放了,子节点对象会被他递归释放的,不需要手动再去释放,否则free的时候会空指针的
void printntab(int iCnt)
{
int i = 0;
for (i = 0; i < iCnt; i++)
{
printf("\t");
}
}
//pJson:json对象
//iCnt:TAB缩进深度
void parseJson(cJSON *pJson, int iCnt)
{
switch (pJson->type)
{
case cJSON_False:
{
printf("%s : %d\n", pJson->string, pJson->valueint);
}
break;
case cJSON_True:
{
printf("%s : %d\n", pJson->string, pJson->valueint);
}
break;
case cJSON_NULL:
{
printf("%s : NULL\n", pJson->string);
}
break;
case cJSON_Number:
{
printf("%s : %d | %lf\n", pJson->string, pJson->valueint, pJson->valuedouble);
}
break;
case cJSON_String:
{
printf("%s : %s\n", pJson->string, pJson->valuestring);
}
break;
case cJSON_Array:
{
printf("%s : [%s]\n", pJson->string, pJson->valuestring);
}
case cJSON_Object:
{
int iSize = cJSON_GetArraySize(pJson);
int i = 0;
iCnt++;
printntab(iCnt);
if (pJson->string)
{
printf("%s : {\n", pJson->string);
}
else
{
printf("{\n");
}
//printf("%s : {\n", NULL == pJson->string ? "" : pJson->string);
for (i = 0; i < iSize; i++)
{
printntab(iCnt);
cJSON *pSub = cJSON_GetArrayItem(pJson, i);
parseJson(pSub, iCnt);
}
printntab(iCnt);
printf("}\n");
}
break;
default:
break;
}
}
int num_arry[1000] = {0};
void JsonProcess(char *json)
{
cJSON *item;
cJSON *rcvpayload = cJSON_Parse((const char *)json);
if (rcvpayload)
{
printf("\r\nget a json:\r\n");
parseJson(rcvpayload, 0);
cJSON *target = cJSON_GetObjectItem(rcvpayload, "addrlist");
if (target)
{
int index = cJSON_GetArraySize(target);
int cnt;
for (cnt = 0; cnt++; cnt < index)
{
item = cJSON_GetArrayItem(target, cnt) ;
if (cJSON_Object == item->type) //如果对应键的值仍为cJSON_Object就递归调用parseJson
parseJson(item);
else //值不为json对象就直接存储进数组并打印出值
{
num_arry[cnt] = atoi(item->string);
printf("%s->", num_arry[cnt]);
}
}
}
cJSON_Delete(rcvpayload);
}
}
|
|