使用cJSON重新构建JSON对象

在使用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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值