先把代码贴上来,有时间整理一下

首先说一下要实现的功能:

假定现在有一个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数组的更多相关文章

  1. linux下利用openssl来实现证书的颁发(详细步骤)--转载和修改

    原文地址:http://www.cnblogs.com/firtree/p/4028354.html linux下利用openssl来实现证书的颁发(详细步骤) 1.首先需要安装openssl,一个开 ...

  2. linux下利用elk+redis 搭建日志分析平台教程

    linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm   elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...

  3. 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

  4. Linux下利用script命令录制并回放终端会话

    Linux下利用script命令录制并回放终端会话 核心命令 script 和 scriptreplay 录制屏幕 script -t 2>timescript typescript 命令解释: ...

  5. 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案

    最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...

  6. 【java】 linux下利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...

  7. Linux下利用Ret2Libc绕过DEP

    Linux下利用Ret2Libc绕过DEP ⑴.  原理分析: 系统库函数通常是不受DEP(关于DEP,可以查看我之前文章的详细介绍)保护的,所以通过将返回地址指向系统函数可以绕过DEP保护,所以可以 ...

  8. Linux下利用nginx实现负载均衡

    linux下利用nginx实现负载均衡 前提条件: 1,安装好jdk 2,安装好tomcat和nginx(可以参考我前两篇文章) 满足前提条件后,要用nginx实现负载均衡,主要是靠配置nginx的配 ...

  9. 介绍linux下利用编译bash设置root账号共用的权限审计设置

    在日常运维工作中,公司不同人员(一般是运维人员)共用root账号登录linux服务器进行维护管理,在不健全的账户权限审计制度下,一旦出现问题,就很难找出源头,甚是麻烦!在此,介绍下利用编译bash使不 ...

随机推荐

  1. MediaPlayer: Couldn't open /storage/emulated/0/kgmusic/download/独家记忆.mp3: java.io.FileNotFoundExcept

    写了一个音乐播放器,播放的时候,会出现这样的问题:比如说我点击第三首歌曲,结果没有播放第三首歌曲,而直接播放了第四首歌曲.看了一下日志.发现报错:MediaPlayer: Couldn't open ...

  2. JAVA框架 Spring AOP注解

    一.准备工作: 1)导入jar包: 4个jar包. 2)约束:(spring需要所有的约束)有IOC约束和AOP 还有事务(tx)以及注解注入的约束(context). <?xml versio ...

  3. QT 用listveiw显示图片

    很多的时候需要浏览图片,一般会使用listview 显示图片,接下来我用listview显示图片 代码如下: QStandardItem * s1; QStandardItem * s2; QStan ...

  4. Android解决Intent中的数据重复问题

    转载地址:http://www.cnblogs.com/anrainie/articles/2383941.html 最近在研究Android,遇到了一些Notification(通知)的问题: .N ...

  5. 大数据入门第十四天——Hbase详解(一)入门与安装配置

    一.概述 1.什么是Hbase 根据官网:https://hbase.apache.org/ Apache HBase™ is the Hadoop database, a distributed, ...

  6. Exp2 MAL_后门原理与实践 20155214

    目录 Exp2 MAL_后门原理与实践 实验内容 通过nc反向连接创建后门 meterpreter应用 主要思路 知识点 启发 Exp2 MAL_后门原理与实践 本次实验操使用nc实现win,mac, ...

  7. 20155311《网络对抗》PC平台逆向破解(二)

    20155311<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  8. 在ListBoxItem的样式中的button传参,把当前选中项传递到命令的方法

    原文:在ListBoxItem的样式中的button传参,把当前选中项传递到命令的方法 前端页面: <Style x:Key="ThumbItemStyle" TargetT ...

  9. 【第十三课】监控Linux系统状态

    目录 1.查看系统负载命令:w.uptime 2.vmstat详解 3.top动态查看负载 4.sar命令(监控网卡流量) 5.nload命令(监控网卡流量) 6.iostat iotop(监控IO性 ...

  10. java maven项目迁移时缺失jar包 或者 maven jar包缺失时的解决方案

    这样弄完,jar包就都下载好了,就不缺失了. 从GitHub上checkout一个项目下来,导入idea后发现加载依赖奇慢无比,所以临时把网络调成FQ的代理,结果会发现idea会停止之前的下载,那怎么 ...