Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组
先把代码贴上来,有时间整理一下
首先说一下要实现的功能:
假定现在有一个json格式的字符串,而且他是一个josn中的数组,比如:
[
{
"id": "NEW2017042605516200",
"id_type": ,
"time": ""
},
{
"id": "20170426A08ZPL00",
"id_type": ,
"time": ""
},
{
"id": "NEW2017042701070500",
"id_type": ,
"time": ""
}
]
假如说我只关心id和time字段,我希望提取这两个字段,也就是说从这个数组的每一个元素中提取id和time字段,最后组成一个新的数组,新的数组效果如下:
[
{
"id": "NEW2017042605516200",
"time": ""
},
{
"id": "20170426A08ZPL00",
"time": ""
},
{
"id": "NEW2017042701070500",
"time": ""
}
]
关键函数的代码如下
函数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 -;
}
if(json_object_get_type(*json) == json_type_object || json_object_get_type(*json) == json_type_array)
{
json_tokener_free(tok);
return ;
}
json_tokener_free(tok);
return -;
}
函数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) == )
{
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 = ;
//遍历整个数组
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 = ;
int j = ;
//重新组装但个元素(提取其中的几个字段)
for(;j < num; j++)
{
char selected_value[MAX_SING_VALUE_LEN];
memset(selected_value,,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 = ; }
if(tag == )
{
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);
} }
}
Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组的更多相关文章
- linux下利用openssl来实现证书的颁发(详细步骤)--转载和修改
原文地址:http://www.cnblogs.com/firtree/p/4028354.html linux下利用openssl来实现证书的颁发(详细步骤) 1.首先需要安装openssl,一个开 ...
- linux下利用elk+redis 搭建日志分析平台教程
linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...
- 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误
嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报 分类: 嵌入式(928) 一般察看函数运行时堆栈的 ...
- Linux下利用script命令录制并回放终端会话
Linux下利用script命令录制并回放终端会话 核心命令 script 和 scriptreplay 录制屏幕 script -t 2>timescript typescript 命令解释: ...
- 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案
最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...
- 【java】 linux下利用nohup后台运行jar文件包程序
Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...
- Linux下利用Ret2Libc绕过DEP
Linux下利用Ret2Libc绕过DEP ⑴. 原理分析: 系统库函数通常是不受DEP(关于DEP,可以查看我之前文章的详细介绍)保护的,所以通过将返回地址指向系统函数可以绕过DEP保护,所以可以 ...
- Linux下利用nginx实现负载均衡
linux下利用nginx实现负载均衡 前提条件: 1,安装好jdk 2,安装好tomcat和nginx(可以参考我前两篇文章) 满足前提条件后,要用nginx实现负载均衡,主要是靠配置nginx的配 ...
- 介绍linux下利用编译bash设置root账号共用的权限审计设置
在日常运维工作中,公司不同人员(一般是运维人员)共用root账号登录linux服务器进行维护管理,在不健全的账户权限审计制度下,一旦出现问题,就很难找出源头,甚是麻烦!在此,介绍下利用编译bash使不 ...
随机推荐
- 企业案例--生产环节更改mysql字符集
查看数据库字符集: show database create dbname \G; 查看数据库表字符集: show table create tbname \G; 查看现有数据库字符集设置: show ...
- android java.lang.ExceptionInInitializerError
11-08 13:36:05.108: E/AndroidRuntime(5318): java.lang.ExceptionInInitializerError 11-08 13:36:05.108 ...
- day35
今日内容: 1.进程间互相通信(IPC机制) 2.生产者消费者模型 3.线程理论 4.线程开启的两种方式 5.线程相关属性方法 6.守护线程 7.线程互斥锁 1.进程间相互通信(IPC机制) 主要是一 ...
- 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明
程序发布后出现问题: 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明 解决办法: 1.安装了odac12. ODTwithODAC121010.z ...
- USB主机控制器ECHI
USB主机控制器ECHI 2017年10月24日 15:44:11 阅读数:239 1. 主机控制器(Host Controller) • UHCI: Universal Host Controlle ...
- Java是如何读到hbase-site.xml 的内容的
Java是如何读到hbase-site.xml 的内容的 Java客户端使用的配置信息是被映射在一个HBaseConfiguration 实例中. HBaseConfiguration有一个工厂方法, ...
- Patchwork(2013年)--CNV检测方法流程
文章题目:Patchwork: allele-specific copy number analysis of whole-genome sequenced tumor tissue 特点: 可以检测 ...
- 利用Cydia Substrate进行Android HOOK
Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的.而Xposed只支持HOOK app_process中的java ...
- 【WPF】两则动画效果
原文:[WPF]两则动画效果 引言 利用WPF的动画可以轻而易举的实现各种各样的特效,如擦除,滑动进入等,先看两个效果图 第一个效果 这个动画其实利用了OpacityMask和LinearGradie ...
- MiZ702学习笔记10——文本实例化IP的方法
之前,添加vivado自带IP的时候,都是以图形化的方式:一般是新建一个Block Design顶层文件,然后将图形化的ip贴到,Block Design中. 但是,在进行PL的开发过程中,有时不想使 ...