【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

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I