【Linux 应用】jsonc解析数据。

2024-04-28 21:48
文章标签 linux jsonc 解析 应用 数据

本文主要是介绍【Linux 应用】jsonc解析数据。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近弄了下jsonc解析数据,记录一下,方便以后查阅。


一、jsonc接口

1、解析成json对象

1.1、将字符串解析成json对象

json_object* json_tokener_parse(const char *str);

1.2、将文件解析成json对象

json_object* json_object_from_file(const char *filename);

2、解析json对象

2.1、取值

json_object* json_object_object_get(json_object* jso, const char *key)

2.2、转化值

//转int类型
int32_t json_object_get_int(struct json_object *obj);
//转string类型
const char* json_object_get_string(struct json_object *obj);

2.3、解析数组对象

json_object* json_object_array_get_idx(struct json_object *obj , int idx);

3、释放json对象

json_object_put(struct json_object *obj);

二、实例

数据

{"program":[{"assetId":"1595839049646290","channelId":"102457500","channelName":"TEST1","dayOfWeek":"6","endDateTime":"20200802012100","programId":"102456699","programName":"test1","startDateTime":"20200801233500","status":"1","viewLevel":"0"},{"assetId":"1595839049643424","channelId":"102457500","channelName":"TEST1","dayOfWeek":"6","endDateTime":"20200801233500","programId":"102456698","programName":"test1","startDateTime":"20200801215900","status":"1","viewLevel":"0"}],"restartAtToken":"1000","totalResults":"29"
}

解析

#include <stdio.h>
#include <string.h>#include <linux/types.h>
#include "json_object.h"
#include "json_object_private.h"#include "jsonDataParse.h"
#include "debugUtils.h"
#include "bits.h"//#define DEBUG 1int iParseJsonString(json_object *retJson, char *pcKey, char *pcValue, int length)
{json_object *jsTemp = NULL;if(retJson == NULL || is_error(jsTemp)){printf("the retJson is error \n");return -1;}jsTemp = json_object_object_get(retJson, pcKey);if(NULL == jsTemp || is_error(jsTemp)){printf("the jsTemp : NULL\n");return -1;}strncpy(pcValue, (char *)json_object_get_string(jsTemp), length);pcValue[length -1] = '\0';return 0;
}int iParseJsonint(json_object *retJson, char *pcKey, int *pcValue)
{json_object *jsTemp = NULL;if(retJson == NULL || is_error(jsTemp)){printf("the retJson is error \n");return -1;}jsTemp = json_object_object_get(retJson, pcKey);if(NULL == jsTemp || is_error(jsTemp)){printf("the jsTemp : NULL\n");return -1;}*pcValue = (int)json_object_get_int(jsTemp);return 0;
}SHOW_LIST_t * parse_showlist(char *databuf, int *length)
{int i = 0;SHOW_LIST_t *listdata = NULL;char totalResults[8]  = {0};char restartAtToken[8]  = {0};json_object *jsonobj = NULL;json_object *tmpjson = NULL;json_object *datajson = NULL;if(NULL == databuf){printf("the databuf is NULL ...\n");return NULL;}jsonobj = json_tokener_parse(databuf);if (is_error(jsonobj)){printf("the jsonobj is error \n");return NULL;}iParseJsonString(jsonobj, "totalResults", totalResults, sizeof(totalResults));if(0 == strlen(totalResults)){printf("totalResults is NULL\n");return NULL;}(*length) = atoi(totalResults);if((*length) <= 0){printf("totalResults : 0\n");return NULL;}GUI_DEBUG("totalResults : %s\n",totalResults);iParseJsonString(jsonobj, "restartAtToken", restartAtToken, sizeof(restartAtToken));GUI_DEBUG("restartAtToken : %s\n",restartAtToken);listdata = (struct SHOW_LIST_t *)malloc(sizeof(struct SHOW_LIST_t)*(*length));if (NULL == listdata){printf("parse_showlist : malloc error \n");return NULL;}memset(listdata, 0, sizeof(struct SHOW_LIST_t)*(*length));tmpjson = json_object_object_get(jsonobj , "program");for(i = 0; i <(*length); i++){datajson = json_object_array_get_idx(tmpjson , i);if(NULL == datajson){break;}iParseJsonString(datajson, "assetId", listdata[i].assetId, sizeof(listdata[i].assetId));iParseJsonString(datajson, "channelId", listdata[i].channelId, sizeof(listdata[i].channelId));iParseJsonString(datajson, "channelName", listdata[i].channelName, sizeof(listdata[i].channelName));iParseJsonString(datajson, "dayOfWeek", listdata[i].dayOfWeek, sizeof(listdata[i].dayOfWeek));iParseJsonString(datajson, "endDateTime", listdata[i].endDateTime, sizeof(listdata[i].endDateTime));iParseJsonString(datajson, "programId", listdata[i].programId, sizeof(listdata[i].programId));iParseJsonString(datajson, "programName", listdata[i].programName, sizeof(listdata[i].programName));iParseJsonString(datajson, "startDateTime", listdata[i].startDateTime, sizeof(listdata[i].startDateTime));iParseJsonString(datajson, "status", listdata[i].status, sizeof(listdata[i].status));iParseJsonString(datajson, "viewLevel", listdata[i].viewLevel, sizeof(listdata[i].viewLevel));}json_object_put(jsonobj);#ifdef DEBUGGUI_DEBUG("------------the program -----------------\n");SHOW_LIST_t *oo = listdata;GUI_DEBUG("{\n\t\"program\":\n\t\t[\n");for(i = 0 ; i < (*length); i++){GUI_DEBUG("\t\t\t\{\"id\":\"%s\",\"name\":\"%s\",\"type\":%s,\"count\":%s\}\n",oo->assetId , oo->channelId,oo->channelName,oo->dayOfWeek);oo++;}GUI_DEBUG("\t\t],\n\t\"totalResults\":%s,\n\t\"restartAtToken\":%s,\n\t\n}\n",totalResults, restartAtToken);#endifreturn listdata;
}

三、结束语

解析json数据四步走:

1、将其转化成json对象

2、解析成json对象

3、转化成对应的数据类型

4、释放json对象

5、需要强调的一点是错误判断不是判空能检测出来的。要用到is_error接口,如下使用:

    jsonobj = json_tokener_parse(databuf);
    if (is_error(jsonobj))
    {
        printf("the jsonobj is error \n");
        return NULL;
    }

这篇关于【Linux 应用】jsonc解析数据。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944348

相关文章

linux进阶高级配置,你需要知道的有哪些2-firewalld防火墙(一)

1、防火墙的技术上分类: 包过滤:firewalld属于这种 应用代理: 状态检测:ASA 2、firewalld的两种配置模式: 运行时配置 :立即生效 永久配置:重新加载服务生效 3、常用的区域: trusted:信任区域,用于连接内部网络 public:公共区域,是默认区域 internal:内部区域,用于连接内部网络 external:外部区域,用于连接互联网,此区域有地址伪装nat功

HIVE大数据平台SQL优化分享

相信很多小伙伴在面试的时候,必然跳不过去的一个问题就是SQL脚本的优化,这是很多面试官爱问的问题,也是可以证明你实力进阶的一个重要的能力。 下面给大家分享一个重量级的大数据行业sql技能---hive大数据平台SQL优化。 此文章是大数据平台运维组从多维度参数(CPU,内存,运行时长等)筛选出TOP任务,联合数据开发人员进行优化,最终出具优化方案优化跑批作业的业务逻辑,SQL逻辑等,并跟进方案

数据新探:用Python挖掘互联网的隐藏宝藏

Hello,我是你们的阿佑,今天给大家上的菜是——数据存储!听起来枯燥无味?错了!阿佑将带你重新认识数据存储的艺术。就像为珍贵的艺术品寻找完美的展览馆,为你的数据选择合适的存储方式同样重要! 文章目录 1. 引言1.1 数据抓取在信息时代的意义1.2 有效存储抓取数据的重要性 2. 数据抓取2.1 发送请求获取网页内容2.1.1 利用`requests`定制请求 headers2.1

linux的 /usr/sbin/nologin /sbin/nologin /bin/false /etc/nologin 的作用与区别

/usr/sbin/nologin /sbin/nologin /bin/false /etc/nologin 的作用与区别 /usr/sbin/nologin /sbin/nologin /bin/false 这三者的作用几乎一样,都是禁止用户登录。/usr/sbin/nologin /sbin/nologin 是同一个文件,通过软连接指向。当把用户的bash设置为:nologinn

大数据可视化实验(五):Tableau数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1)打开数据源... 1 2)进入工作簿... 2 3)字段设置... 2 4)数据筛选... 3 5)绘制条形图... 3 四、思考问题... 4 五、总结与心得体会... 4 一、实验目的 了解Tableau的特点,能进行简单的与Tableau有关的操作,能够制作Tableau的可视化

【数据可视化01】matplotlib实例3之数据统计

目录 一、引言二、实例介绍1.百分位数为横条形图2.箱线图定制化3.带有自定义填充颜色的箱线图4.箱线图5.箱线图和小提琴图6.二维数据集的置信椭圆 一、引言 matplotlib库 可以用来创建各种静态、动态、交互式的图形,并广泛应用于数据分析和数据可视化领域。 二、实例介绍 1.百分位数为横条形图 2.箱线图定制化 3.带有自定义填充颜色的箱线图 4.箱线图 5.箱线

Android客户端和服务器数据交互

1.BasicNameValuePair(基础的NAME-VALUE对) java.lang.Object 继承者 org.apache.http.message.BasicNameValuePair 由此可看出使用于网络通信. 主要用于存放即将传输给服务器端的 数据对! 如服务器设置数据为 那么在程序中的数据封装就应该为 ArrayList arrayList2 = new Arr

Linux:配置客户端自定义autofs服务

Linux:配置客户端自定义autofs服务 修改autofs的主策略文件 [root@server200 data]# vim /etc/auto.master# 修改内容如下/misc /etc/auto.misc# 挂载目录的上级目录/mnt /etc/auto.timinglee --timeout=3 修改autofs的自定义策略文件 [root@server2

Android 百万级视频应用开发(二)

在完成可之前的思考之后,我感觉我也是绞尽脑汁了。 7月25号的时候出了效果图,和切图,我26号下午完成了整个软件的页面搭建。历史8.5小时26个页面。但是我想我应该可以做的更好,因为,我的封装做的还不彻底,既然复用那么复用率就应该达到100%!既然封装,那么就应该封装到极致。 之后26号的晚上一直在思考如何降低后台开销。到了27号的时候,公司告诉我用阿里云服务器,解决。也是花几千块,真的比自己

Android 百万级视频应用 开发记录(一)

来到公司接到项目,已有用户在1亿左右,日活跃用户可能在100W。这些对于我来说,都是一些天文数字。之前开发的应用最多也就是地区性的几千人用而已。所以接到这个项目总体还是很兴奋的,也有点怵。不过挑战只是机遇的另外一种说法。 项目立项:7月20号 ,集合了目前所有的技术骨干人员,都是组长级的去开会了。 项目提交:8月18号 包括产品经理设计 美工出图 测试 实际开发周期:14天左右 7天调试 然