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

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

假定现在有一个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. Spring framework3.2整合hibernate4.1报错:No Session found for current thread

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransact ...

  2. Jenkins Extended E-mail Notification 2个注意事项:

    1.Use SMTP AUTHentication 下 user name 所定义的邮箱,必须和全局配置的管理邮箱一直,否则会报错: Error sending to the following VA ...

  3. Centos7 安装Nodejs

    使用EPEL安装 EPEL(Extra Packages for Enterprise Linux)企业版Linux的额外软件包,是Fedora小组维护的一个软件仓库项目,为RHEL/CentOS提供 ...

  4. abp 将abp项目发布之后挂在IIS上无法访问嵌入资源的问题

    在本地调试是能够正常访问到写在另一个程序集中的嵌入资源,但是发布之后 挂在IIS上却不能访问. 整了半天没找到原因.后来发现是发布时配置错误造成的:取消勾选precompile during publ ...

  5. struts2_文件上传的功能

    使用Struts内置的fileUpload拦截器(已默认配置)即可,设计的电商网站,提供用户头像上传的功能 1. 2. 3. 4. 5. 5.未使用拦截器 6.未使用filename 7. 8. 9.

  6. 如何判断Android设备是否为模拟器

    android.os.Build.BRAND:获取设备品牌 如果获取的Landroid/os/Build;->BRAND的值为 "generic"则为模拟器上运行. andr ...

  7. Java中枚举的写法和用法

            在公司代码中,用了一大堆的枚举,看得我好懵逼.下面开始看看枚举怎么写和怎么用. 一.枚举的写法         关于枚举的写法,网上好多这方面的知识.这里直接贴一个我自己写的枚举类的代 ...

  8. VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。

    原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...

  9. 【HNOI2016】网络

    题面 题解 考虑整体二分. 定义整体二分函数solve(l, r, ql, qr)表示操作权值在\([l, r]\)中,对\([ql, qr]\)的询问进行二分. 这样的话check就会很简单,先按照 ...

  10. 利用Python统计微信联系人男女比例以及简单的地区分布

    寒暄的话不多说,直接进入主题. 运行效果图: [准备环境] Python版本:v3.5及其以上 开发工具:随意,此处使用Pycharm [依赖包] 1.itchat (CMD运行:pip instal ...