Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组
2017-04-27 19:38
1076 查看
先把代码贴上来,有时间整理一下
首先说一下要实现的功能:
假定现在有一个json格式的字符串,而且他是一个josn中的数组,比如:
假如说我只关心id和time字段,我希望提取这两个字段,也就是说从这个数组的每一个元素中提取id和time字段,最后组成一个新的数组,新的数组效果如下:
关键函数的代码如下
函数1:将一个字符串转换成json-c中的json_object格式
函数2:
在一个json_object中递归查找指定的key的value,(注意:没有处理json数组的情况)
提取的value保存在了参数value中,
注意我没有处理json_object为数组的情况,此外如果其中嵌套了数组也不能找出来
函数3:
实现想要的功能
首先说一下要实现的功能:
假定现在有一个json格式的字符串,而且他是一个josn中的数组,比如:
[ { "id": "NEW2017042605516200", "id_type": 0, "time": "1493270962" }, { "id": "20170426A08ZPL00", "id_type": 0, "time": "1493270924" }, { "id": "NEW2017042701070500", "id_type": 0, "time": "1493270901" } ]
假如说我只关心id和time字段,我希望提取这两个字段,也就是说从这个数组的每一个元素中提取id和time字段,最后组成一个新的数组,新的数组效果如下:
[ { "id": "NEW2017042605516200", "time": "1493270962" }, { "id": "20170426A08ZPL00", "time": "1493270924" }, { "id": "NEW2017042701070500", "time": "1493270901" } ]
关键函数的代码如下
函数1:将一个字符串转换成json-c中的json_object格式
int string_to_json(char *string, unsigned long len, json_object **json) { json_tokener *tok = json_tokener_new();//创建一个json_tokener对象,以便进行转换,记得要释放 enum json_tokener_error jerr; do { *json = json_tokener_parse_ex(tok, string, len); }while((jerr = json_tokener_get_error(tok)) == json_tokener_continue); if(jerr != json_tokener_success || tok->char_offset < (int)len) { json_tokener_free(tok); return -1; } if(json_object_get_type(*json) == json_type_object || json_object_get_type(*json) == json_type_array) { json_tokener_free(tok); return 0; } json_tokener_free(tok); return -1; }
函数2:
在一个json_object中递归查找指定的key的value,(注意:没有处理json数组的情况)
提取的value保存在了参数value中,
注意我没有处理json_object为数组的情况,此外如果其中嵌套了数组也不能找出来
//第归查找单个字段 void get_json_value(json_object *json, const char *key ,char value[]) { if(json_object_get_type(json) == json_type_object ) { json_object_object_foreach(json,json_key,json_value) { if(strcmp(json_key, key) == 0) { strcpy(value,json_object_get_string(json_value)); return; } get_json_value(json_value,key,value); } } }
函数3:
实现想要的功能
//从一个json的数组中抽取每个元素的部分字段,组成一个新的json数组 //其中new_json为原始数组,key为待提取的字段的名字,index为对应的新的字段的名字,num表示提取的字段的个数, //value存储最后抽取出来的json数组 void parse_json_arr(json_object *new_json,char keys[][MAX_KEY_LEN],char indexs[][MAX_KEY_LEN],int num,char value[]) { //必须保证new_json是一个数组 if(json_object_get_type(new_json) == json_type_array) { int ele_num = json_object_array_length(new_json); if(ele_num > ARR_MAX_NUM) ele_num = ARR_MAX_NUM; //只取60个元素 //最终组成的json数组 json_object *array_json = json_object_new_array();//记得要释放 int i = 0; //遍历整个数组 for(;i < ele_num;i++) { //每一个元素 json_object *ele_json = json_object_array_get_idx(new_json,i); //提取部分字段后 json_object *selected_json = json_object_new_object();//应该也不用释放 int tag = 0; int j = 0; //重新组装但个元素(提取其中的几个字段) for(;j < num; j++) { char selected_value[MAX_SING_VALUE_LEN]; memset(selected_value,0,MAX_SING_VALUE_LEN); get_json_value(ele_json, keys[j], selected_value); json_object *json_part = json_object_new_string(selected_value);//这个应该是不用释放 json_object_object_add(selected_json,indexs[j],json_part); tag = 1; } if(tag == 1) { json_object_array_add(array_json, selected_json); } } //将json转换成字符串 strncpy(value,json_object_get_string(array_json),MAX_VALUE_LEN); //释放 if(json_object_get_type(array_json) != json_type_null) { json_object_put(array_json); } } }
相关文章推荐
- 利用已存在的数组,经过条件筛选后,再将筛选剩下的元素组成一个数组
- 比较高效地实现从两个不同数组中提取相同部分组成新的数组(暂时只支持Int类型)
- 3.有一个整数数组,请声明一个字符串数组,将整数数组中的每一个元素的值转换为字符串保存到字符串数组中
- 数组 :定义一个有20个元素的数组,每一个元素的取值范围是[30 ,70],求他们的和
- 如何向以json对象为元素的数组中追加一个新的元素
- 华为机试:从一个数组中选取不同的数(均小于10)组成一个最大的三位数
- 利用二分查找在循环递增数组中检索一个元素
- 指针_习题设计一个程序,利用指针输出数组中任一行任一列元素的值【知识重点】
- 将一个数组中的元素利用另一个数组中的元素进行拆分
- 巧妙利用快速排序法的原理求一个数组中的第10大元素
- 利用C实现:编写一个函数,它从一个字符串中提取一个子字符串。
- 黑马程序员之C#编程基础学习笔记:有一个整数数组,请声明一个字符串数组,将整数数组中的每一个元素的值转换为字符串保存到字符串数组中
- 将一个数组中的奇元素全部移到数组的前半部分,即将奇偶元素分开
- 利用JSONC库遍历求出JSON数组的元素值
- 将一个数组中的每一个元素初始化为0
- js:splice()方法(从一个数组中移除一个或多个元素)
- 利用二维int型数组表达一个矩阵,创建该数组并将其元素打印输出
- 将一个数组中的奇元素全部移到数组的前半部分,即将奇偶元素分开
- List的All方法使用问题:我用List1的All方法来确保List1的所有每个数组元素中是否包含Arr1中的任意元素,这个部分很难实现。 因为,没有一个数组中是否包含另一个数组中的任意元素这个功能
- 编写一个函数,它从一个字符串中提取一个子字符串。函数原型如下: Int substr(char dst[], char src[],int start, int len) {} 目标是:从src数组