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

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

假定现在有一个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. 【Git】删除某个全局配置项

    1.查看Git所有配置 git config --list 2.删除全局配置项 (1)终端执行命令: git config --global --unset user.name (2)编辑配置文件: ...

  2. CentOS7服务器上部署深度/机器学习环境推荐首选anaconda3

    CentOS7服务器上部署深度/机器学习环境推荐首选anaconda3,亲测~~ 因为可以创建不同的环境版本或虚拟环境 CentOS7服务器安装anaconda3后,CentOS7服务器开启后自动将a ...

  3. cloudstack 创建虚拟机失败

    Trying to find a potenial host and associated storage pools from the suitable host/pool lists for th ...

  4. day32

    今日内容 1.基于TCP协议(通信循环) 2.基于TCP协议(连接循环) 3.粘包问题 4.模拟SSH实现远程执行命令 服务器端 ################################### ...

  5. jqgrid 选中行触发编辑,切换下一行时验证和异步保存上一行数据

    有时,我们需要批量修改或填写一些相似的数据.可以以jqgrid表来显示,可能的效果如下: 选中触发行编辑参考:jqgrid 单击行启用行编辑,切换行保存原编辑行 本文主要说说验证和异步保存上一条数据的 ...

  6. Web.config中 mode="RemoteOnly" 跟mode="On" 区别

    转载网址:mode="RemoteOnly" 跟mode="On" 区别 <!-- 自定义错误信息 设置 customErrors mode=" ...

  7. python 字典,元组,对象,数组取值方法

    def create(self,cr,uid,vals,context=None): if context is None: context ={} if vals.get('name','/')== ...

  8. MSTECHLNK

    MSTECHLNK(微软技术直通车) 时间:2017.12.16地点:微软中关村办公楼天安门会议室

  9. Multi account chang login with multi -thread

    void worker_DoWork(object sender, DoWorkEventArgs e) { isBussy = true; if (Common.isChangingAccount) ...

  10. 网络对抗技术 2017-2018-2 20152515 Exp6 信息搜集与漏洞扫描

    1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法.包括: (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的 ...