在使用cJSON_AddItemToArray方法添加item时出现了问题,在此记录一下。
测试使用的json对象:
{
"services": [
{
"name": "TXT",
"servers": [
{
"name": "www",
"url": " "
},
{
"name": "www",
"url": " "
}
]
},
{
"name": "BIN",
"servers": [
{
"name": "Pro server",
"url": " "
},
{
"name": "BIN",
"url": " "
}
]
},
{
"name": "MP4",
"servers": [
{
"name": "Pro server",
"url": " "
},
{
"name": "Backup server",
"url": " "
}
]
},
{
"name": "###",
"servers": [
{
"name": "Pro server",
"url": " "
},
{
"name": "Backup server",
"url": " "
}
]
},
{
"name": "&&&",
"servers": [
{
"name": "Pro server",
"url": " "
},
{
"name": "Backup server",
"url": " "
}
]
},
{
"name": "MP3",
"servers": [
{
"name": "Pro server",
"url": " "
},
{
"name": "Backup server",
"url": " "
}
]
}
]
}
以下是重新构造JSON对象的源码。
static int getServices(char **replyString)
{
cJSON *body, *root;
cJSON *filter_root = NULL;
int i;
body = cJSON_CreateObject();
if(!body)
{
printf("Body create failes\n");
return 0;
}
/* get rtmp services info
*/
FILE *fp = fopen("/root/services.json", "rb");
if(!fp)
{
printf("Open services.json failed!\n");
return 0;
}
fseek(fp, 0, SEEK_END); //将文件指针fp的位置移动到文件末尾
int fp_size = ftell(fp); //得到fp当前位置相对于文件首的偏移字节数,获得文件大小
rewind(fp); //将fp重新指向文件的开头
char *date_buffer = calloc(fp_size, sizeof(char));
if(date_buffer==NULL)
{
printf("calloc buffer is failed!\n");
fclose(fp);
return 0;
}
int ret = fread(date_buffer, sizeof(char), fp_size, fp);
if(ret != fp_size)
{
printf(("Read buffer is failed");
fclose(fp);
return 0;
}
/* Refactoring json objects
*/
root = cJSON_Parse(date_buffer);
cJSON *array = NULL;
cJSON *item = NULL;
cJSON *service_item = NULL;
cJSON *new_array = cJSON_CreateArray();
filter_root = cJSON_CreateObject();
array = cJSON_GetObjectItem(root, "services");
int services_num = cJSON_GetArraySize(array);
for(i = 0; i < services_num; i++)
{
item = cJSON_GetArrayItem(array, i);
service_item = cJSON_GetObjectItem(item, "name");
if( Str_isEqual("TXT", service_item->valuestring) ||
Str_isEqual("BIN", service_item->valuestring) ||
Str_isEqual("MP4", service_item->valuestring) ||
Str_isEqual("MP3", service_item->valuestring) )
{
cJSON_AddItemToArray(new_array, cJSON_Parse(cJSON_Print(item))); //直接使用item时,会卡在这里。
}
}
cJSON_AddItemToObject(filter_root, "services", new_array);
cJSON_AddItemToObject(body, "Info", filter_root);
if(root != NULL)
cJSON_Delete(root);
fclose(fp);
*replyString = cJSON_Print(body);
free(date_buffer);
date_buffer = NULL;
cJSON_Delete(body);
return 1;
}