Linux下的json-c
一、json-c库的安装(ubuntu)
- root用户运行以下命令:
apt-get install libjson0-dev libjson0
- 非root用户运行以下命令:
sudo apt-get install libjson0-dev libjson0
二、解析json数据
1. json_object
json_object是JSON-C库中定义的一个结构体,用于表示JSON对象。
它的内部定义如下:
struct json_object {enum json_type o_type; // JSON对象的类型union data {boolean c_boolean; // 布尔类型的值double c_double; // 双精度浮点数类型的值int c_int; // 整数类型的值struct lh_table* c_object; // 对象类型的值struct array_list* c_array; // 数组类型的值char* c_string; // 字符串类型的值} o;
};
2.json_tokener_parse
函数原型:
struct json_object* json_tokener_parse(const char* str);
参数:
- str:要解析的 JSON 字符串。
返回值:
- 如果解析成功,返回一个指向 json_object 结构体的指针,表示解析后的 JSON 对象。
- 如果解析失败,返回 NULL。
3.代码实例
#include <stdio.h>
#include <json-c/json.h>
#include <string.h>int main()
{const char *str = "{\"name\":\"jack\",\"age\":\"22\",\"sex\":\"male\"}";//把符合json格式的字符串转换成json对象struct json_object *obj = json_tokener_parse(str);//把json对象转换成字符串printf("%s\n", json_object_to_json_string(obj));return 0;
}
三、创建json对象和添加json对象(string、int)和访问json对象
1. json_object_new_object
在 json-c 库中,json_object_new_object 函数用于创建一个空的 JSON 对象。
函数原型:
struct json_object* json_object_new_object(void);
返回值:
- 返回一个指向 json_object 结构体的指针,表示创建的空 JSON 对象。
2.json_object_object_add
在 json-c 库中,json_object_object_add 函数用于向 JSON 对象中添加一个键值对。
以下是该函数的用法:
int json_object_object_add(struct json_object* obj, const char* key, struct json_object* val);
_
参数:
参数:
- obj:要添加键值对的 JSON 对象。
- key:要添加的键,以字符串形式表示。
- val:要添加的值,可以是任何 JSON 数据类型的对象。
返回值:
- 如果成功添加键值对,返回 0。
- 如果出现错误,返回 -1。
3.json_object_object_get_ex
在 json-c 库中,json_object_object_get_ex 函数用于从 JSON 对象中获取指定键的值,并将其存储在提供的变量中。
以下是该函数的用法:
int json_object_object_get_ex(const struct json_object* obj, const char* key, struct json_object** val);
参数:
- obj:要从中获取值的 JSON 对象。
- key:要获取值的键,以字符串形式表示。
- val:用于存储获取到的值的指针。
返回值:
- 如果找到指定键的值并成功存储在 val 指针中,返回 1。
- 如果未找到指定键的值,返回 0。
使用 json_object_object_get_ex 函数可以从 JSON 对象中获取指定键的值,并将其存储在提供的变量中。你需要传递要获取值的 JSON 对象指针 obj、要获取值的键的字符串表示 key,以及一个指向 json_object* 类型的指针 val,用于存储获取到的值。
4.json_object_get_type
在 json-c 库中,json_object_get_type 函数用于获取 JSON 对象的数据类型。
以下是该函数的用法:
enum json_type json_object_get_type(const struct json_object* obj);
参数:
- obj:要获取数据类型的 JSON 对象。
返回值“:
返回一个 enum json_type 枚举类型的值,表示 JSON 对象的数据类型。json_type 枚举类型定义了不同的 JSON 数据类型,如下所示:
- json_type_null:表示 JSON 对象是空值(null)。
- json_type_boolean:表示 JSON 对象是布尔值(true 或 false)。
- json_type_double:表示 JSON 对象是双精度浮点数。
- json_type_int:表示 JSON 对象是整数。
- json_type_object:表示 JSON 对象是一个对象。
- json_type_array:表示 JSON 对象是一个数组。
- json_type_string:表示 JSON 对象是一个字符串。
使用 json_object_get_type 函数可以获取 JSON 对象的数据类型。你需要传递要获取数据类型的 JSON 对象指针 obj,然后函数将返回对应的 enum json_type 枚举值。
5.json_object_get_string
json_object_get_string 是 json-c 库中的一个函数,用于获取 JSON 对象中字符串类型的值。
以下是该函数的用法:
const char* json_object_get_string(const struct json_object* obj);
参数:
- obj:要获取字符串值的 JSON 对象。
返回值:
- 返回一个指向字符串的指针,表示 JSON 对象中的字符串值。如果 JSON 对象不是字符串类型或者出现错误,返回 NULL。
6.json_object_get_int
json_object_get_int 是 json-c 库中的一个函数,用于获取 JSON 对象中整数类型的值。
以下是该函数的用法:
int json_object_get_int(const struct json_object* obj);
参数:
- obj:要获取整数值的 JSON 对象。
返回值:
- 返回 JSON 对象中的整数值。如果 JSON 对象不是整数类型或者出现错误,返回 0。
使用 json_object_get_int 函数可以获取 JSON 对象中整数类型的值。你需要传递要获取整数值的 JSON 对象指针 obj,然后函数将返回该整数值。
7.代码实例
#include <stdio.h>
#include <json-c/json.h>
#include <string.h>int main()
{//创建json对象struct json_object *obj = json_object_new_object();//往json对象添加键值对,json_object_new_string:把字符串转换成json对象json_object_object_add(obj, "name", json_object_new_string("jack"));json_object_object_add(obj, "age", json_object_new_int(22));json_object_object_add(obj, "sex", json_object_new_string("male"));//打印json对象printf("%s\n", json_object_to_json_string(obj));printf("%ld\n", strlen(json_object_to_json_string(obj)));//解析json//第一步:根据健名解析出对应的json对象struct json_object *json;json_object_object_get_ex(obj, "name", &json);//第二步:根据json对象类型转换成对应的数据//先获取json对象类型json_type type = json_object_get_type(json);if(json_type_string == type) //判断类型释放一致printf("name: %s\n", json_object_get_string(json)); //将json对象转换成字符串类型json_object_object_get_ex(obj, "age", &json);printf("age: %d\n", json_object_get_int(json));json_object_object_get_ex(obj, "sex", &json);printf("sex: %s\n", json_object_get_string(json));printf("sex: %s\n", json_object_get_string(json));return 0;
}
四、json数组的添加于解析
1.json_object_new_array
json_object_new_array 是 json-c 库中的一个函数,用于创建一个新的 JSON 数组对象。
以下是该函数的用法:
struct json_object* json_object_new_array(void);
返回值:
- 返回一个指向新创建的 JSON 数组对象的指针。
使用 json_object_new_array 函数可以创建一个新的空的 JSON 数组对象。函数将返回一个指向该数组对象的指针,你可以使用这个指针进行后续的操作,如向数组中添加元素。
2.json_object_array_length
json_object_array_length 是 json-c 库中的一个函数,用于获取 JSON 数组对象中元素的个数。
以下是该函数的用法:
int json_object_array_length(const struct json_object* obj);
参数:
- obj:要获取元素个数的 JSON 数组对象。
返回值:
- 返回 JSON 数组对象中元素的个数。如果 obj 不是一个 JSON 数组对象,返回 0。
使用 json_object_array_length 函数可以获取 JSON 数组对象中元素的个数。你需要传递要获取元素个数的 JSON 数组对象指针 obj,然后函数将返回该数组对象中元素的个数。
3.json_object_array_get_idx
json_object_array_get_idx 是 json-c 库中的一个函数,用于获取 JSON 数组对象中指定索引位置的元素。
以下是该函数的用法:
struct json_object* json_object_array_get_idx(const struct json_object* obj, int idx);
参数:
- obj:要获取元素的 JSON 数组对象。
- idx:要获取元素的索引位置。
返回值:
- 返回 JSON 数组对象中指定索引位置的元素的指针。如果 obj 不是一个 JSON 数组对象或者索引越界,返回 NULL。
使用 json_object_array_get_idx 函数可以获取 JSON 数组对象中指定索引位置的元素。你需要传递要获取元素的 JSON 数组对象指针 obj,以及要获取元素的索引位置 idx。函数将返回指定索引位置的元素的指针。
4. 代码实例
#include <stdio.h>
#include <json-c/json.h>
#include <string.h>int main()
{struct json_object *obj = json_object_new_object();json_object_object_add(obj, "name", json_object_new_string("jack"));//创建json对象数组struct json_object *array = json_object_new_array();json_object_array_add(array, json_object_new_int(100));json_object_array_add(array, json_object_new_int(90));json_object_array_add(array, json_object_new_int(80));//把数组对象添加到json对象中json_object_object_add(obj, "score", array);printf("%s\n", json_object_to_json_string(obj));struct json_object *json;json_object_object_get_ex(obj, "score", &json);if(json_object_get_type(json) == json_type_array){ int size = json_object_array_length(json); //获取json_type_array的长度for(int i = 0; i < size; i++){struct json_object *j = json_object_array_get_idx(json, i); //根据下标提取json对象if(json_type_int == json_object_get_type(j))printf("%d\n", json_object_get_int(j));}} return 0;
}
五、json-c的TCP实例
1.服务器
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <json-c/json.h>int main()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(-1 == sockfd){ perror("socket");exit(1);} struct sockaddr_in server_info;bzero(&server_info, sizeof(server_info));server_info.sin_family = AF_INET;server_info.sin_port = 7000;server_info.sin_addr.s_addr = inet_addr("127.0.0.1");if(bind(sockfd, (struct sockaddr *)&server_info, sizeof(server_info)) == -1) { perror("bind");exit(2);} if(listen(sockfd, 10) == -1) {perror("listen");exit(3);}printf("等待客户端连接...\n");struct sockaddr_in client_info;int length = sizeof(client_info);int fd = accept(sockfd, (struct sockaddr *)&client_info, &length);if(-1 == fd){perror("accept");exit(3);}printf("接受客户端 %d 的连接\n", fd);char buf[1024] = {0};int size = recv(fd, buf, 1024, 0);if(-1 == size){perror("recv");exit(4);}//把字符串转换成jsonstruct json_object *obj = json_tokener_parse(buf);struct json_object *json;json_object_object_get_ex(obj, "name", &json);printf("name : %s\n", json_object_get_string(json));json_object_object_get_ex(obj, "age", &json);printf("age : %d\n", json_object_get_int(json));json_object_object_get_ex(obj, "sex", &json);printf("sex : %s\n", json_object_get_string(json));close(fd);close(sockfd);
}
2.客户端
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <json-c/json.h>int main()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(-1 == sockfd){ perror("socket");exit(1);} struct sockaddr_in server_info;bzero(&server_info, 0); server_info.sin_family = AF_INET;server_info.sin_port = 7000;server_info.sin_addr.s_addr = inet_addr("127.0.0.1");if(connect(sockfd, (struct sockaddr *)&server_info, sizeof(server_info)) == -1) { perror("connect");exit(2);} struct json_object *json = json_object_new_object();json_object_object_add(json, "name", json_object_new_string("jack"));json_object_object_add(json, "age", json_object_new_int(24));json_object_object_add(json, "sex", json_object_new_string("male"));const char *buf = json_object_to_json_string(json);if(send(sockfd, buf, strlen(buf), 0) == -1){perror("send");exit(3);}printf("字符串 %s 发送成功,长度:%ld\n", buf, strlen(buf));close(sockfd);return 0;
}
相关文章:
Linux下的json-c
一、json-c库的安装(ubuntu) root用户运行以下命令: apt-get install libjson0-dev libjson0非root用户运行以下命令: sudo apt-get install libjson0-dev libjson0二、解析json数据 1. json_object json_object是JSON-C库中定义的一个结构体&#…...

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表
什么是ScottPlot.WPF? ScottPlot.WPF 是一个开源的数据可视化库,用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本,提供了简单易用的 API,使开发人员能够通过简单的代码创建各种类型的图表&#…...

如何修复Mac的“ kernel_task” CPU使用率过高的Bug?
当计算机开始缓慢运行时,这从来都不是一件有趣的事情,但是当您弄不清它为何如此缓慢时,甚至会变得更糟。如果您已经关闭了所有程序,并且Mac上的所有内容仍然感觉像是在糖蜜中移动,这可能是令人讨厌的kernel_task导致高…...

【NodeJS】006- API模块与会话控制介绍d
1.简介 1.1 接口是什么 接口是 前后端通信的桥梁 简单理解:一个接口就是 服务中的一个路由规则 ,根据请求响应结果 接口的英文单词是 API (Application Program Interface),所以有时也称之为 API 接口 这里的接口指的是『数据接口』&#…...

[UI5 常用控件] 08.Wizard,NavContainer
文章目录 前言1. Wizard1.1 基本结构1.2 属性1.2.1 Wizard:complete1.2.2 Wizard:finishButtonText1.2.3 Wizard:currentStep1.2.4 Wizard:backgroundDesign1.2.5 Wizard:enableBranching1.2.6 WizardStep:…...

EasyExcel分页上传数据
EasyExcel分页上传数据 一、实例 controller上传入口 PostMapping("/upload")ResponseBodyLog(title "导入工单", businessType BusinessType.IMPORT)public AjaxResult uploadFile(HttpServletRequest request, MultipartFile files) throws Exceptio…...

Spring Native 解放 JVM
一、Spring Native 是什么 Spring Native可以通过GraalVM将Spring应用程序编译成原生镜像,提供了一种新的方式来部署Spring应用。与Java虚拟机相比,原生镜像可以在许多场景下降低工作负载,包括微服务,函数式服务,非常…...
汇编的两道题
1.编写一个在显示器上显示一个笑脸字符的程序 看这段程序的结构,可以看出,每个代码段,带有segment的必须用ASSUME 来进行段分配。 PROG1 SEGMENT;PROG1段的开始ASSUME CS:PROG1;PROG1(自己命名的,叫啥都可以ÿ…...

Seurat - 聚类教程 (1)
设置 Seurat 对象 在本教程[1]中,我们将分析 10X Genomics 免费提供的外周血单核细胞 (PBMC) 数据集。在 Illumina NextSeq 500 上对 2,700 个单细胞进行了测序。可以在此处[2]找到原始数据。 我们首先读取数据。 Read10X() 函数从 10X 读取 cellranger 管道的输出&…...

Mac 版 Excel 和 Windows 版 Excel的区别
Excel是一款由微软公司开发的电子表格程序,广泛应用于数据处理、分析和可视化等领域。它提供了丰富的功能和工具,包括公式、函数、图表和数据透视表等,帮助用户高效地处理和管理大量数据。同时,Excel还支持与其他Office应用程序的…...

【报错解决】-bash: export: `-8‘: not a valid identifier 不是有效的标识符
现象 一登陆就提示-bash: export: -8’: not a valid identifier 不是有效的标识符 问题出现的原因 设置字符集时多写了空格 [rootdb1 ~]# cat >>/etc/profile<<EOF export LANGen_US.UTF -8(-8前不应有空格) EOF 解决方法 cd /etc vi profile 把export带有-8的…...

Docker-Learn(三)创建镜像Docker(换源)
根据之前的内容基础,本小点的内容主要涉及到的内容是比较重要的文本Dockerfile 1. 编辑Dockerfile 启动命令行终端(在自己的工作空间当中),创建和编辑Dockerfile。 vim Dockerfile然后写入以下内容 # 使用一个基础镜像 FROM ubuntu:late…...

「递归算法」:二叉树剪枝
一、题目 给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 node 的后代。 示例 1: 输入:root [1,null,0,0,1] 输出&…...
Kafka下载(kafka和jdk、zookeeper、SpringBoot的版本对应关系)
文章目录 一、准备工作1、必须环境2、kafka使用自带的zookeeper还是自己单独部署zookeeper?二、下载一、准备工作 1、必须环境 kafka本身的开发语言是Scala,而Scala是基于jdk开发的,所以要先安装jdk kafka版本jdk版本kafka使用jdk版本官网说明1.0建议使用1.8https://kafka.…...
自然语言NLP
什么是NLP NLP(Natural Language Processing)是自然语言处理的缩写,是计算机科学和人工智能领域的一个研究方向。NLP致力于使计算机能够理解、处理和生成人类自然语言的能力。通过NLP技术,计算机可以通过识别和理解语言中的文本…...
容器库(5)-std::list
std::forward_list是可以从任何位置快速插入和移除元素的容器,不支持快速随机访问,支持正向和反向的迭代。 本文章的代码库: https://gitee.com/gamestorm577/CppStd 成员函数 构造、析构和赋值 构造函数 可以用元素、元素列表、迭代器…...

配置VMware实现从服务器到虚拟机的一键启动脚本
正文共:1666 字 15 图,预估阅读时间:2 分钟 首先祝大家新年快乐!略备薄礼,18000个红包封面来讨个开年好彩头! 虽然之前将服务器放到了公网(成本增加了100块,内网服务器上公网解决方案…...

第5讲小程序微信用户登录实现
小程序微信用户登录实现 小程序登录和jwt,httpclient工具类详细介绍可以看下小锋老师的 小程序电商系统课程:https://www.bilibili.com/video/BV1kP4y1F7tU application.yml加上小程序登录需要的参数,小伙伴们可以登录小程序后台管理&#…...

Kong 负载均衡
负载均衡是一种将API请求流量分发到多个上游服务的方法。负载均衡可以提高整个系统的响应速度,通过防止单个资源过载而减少故障。 在以下示例中,您将使用部署在两台不同服务器或上游目标上的应用程序。Kong网关需要在这两台服务器之间进行负载均衡&…...

基于Chrome插件的Chatgpt对话无损导出markdown格式(Typora完美显示)
Google插件名称为:ChatGPT to MarkDown plus, 下载地址为ChatGPT to MarkDown plus使用方法:见GitHub主页或插件介绍页面https://github.com/thisisbaiy/ChatGPT-To-Markdown-google-plugin/tree/main 我将源代码上传至了GitHub,欢迎star, Is…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...

npm安装electron下载太慢,导致报错
npm安装electron下载太慢,导致报错 背景 想学习electron框架做个桌面应用,卡在了安装依赖(无语了)。。。一开始以为node版本或者npm版本太低问题,调整版本后还是报错。偶尔执行install命令后,可以开始下载…...

SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
【导读】 本文针对无人机(UAV)视频中目标尺寸小、运动快导致的多目标跟踪难题,提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪(贴合无人机场景特性),并改进传统外观匹配算法以关联此类检测…...