当前位置: 首页 > news >正文

Linux下的json-c

一、json-c库的安装(ubuntu)

  1. root用户运行以下命令:
apt-get install libjson0-dev libjson0
  1. 非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用户运行以下命令&#xff1a; apt-get install libjson0-dev libjson0非root用户运行以下命令&#xff1a; sudo apt-get install libjson0-dev libjson0二、解析json数据 1. json_object json_object是JSON-C库中定义的一个结构体&#…...

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表

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

如何修复Mac的“ kernel_task” CPU使用率过高的Bug?

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

【NodeJS】006- API模块与会话控制介绍d

1.简介 1.1 接口是什么 接口是 前后端通信的桥梁 简单理解&#xff1a;一个接口就是 服务中的一个路由规则 &#xff0c;根据请求响应结果 接口的英文单词是 API (Application Program Interface)&#xff0c;所以有时也称之为 API 接口 这里的接口指的是『数据接口』&#…...

[UI5 常用控件] 08.Wizard,NavContainer

文章目录 前言1. Wizard1.1 基本结构1.2 属性1.2.1 Wizard&#xff1a;complete1.2.2 Wizard&#xff1a;finishButtonText1.2.3 Wizard&#xff1a;currentStep1.2.4 Wizard&#xff1a;backgroundDesign1.2.5 Wizard&#xff1a;enableBranching1.2.6 WizardStep&#xff1a;…...

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应用程序编译成原生镜像&#xff0c;提供了一种新的方式来部署Spring应用。与Java虚拟机相比&#xff0c;原生镜像可以在许多场景下降低工作负载&#xff0c;包括微服务&#xff0c;函数式服务&#xff0c;非常…...

汇编的两道题

1.编写一个在显示器上显示一个笑脸字符的程序 看这段程序的结构&#xff0c;可以看出&#xff0c;每个代码段&#xff0c;带有segment的必须用ASSUME 来进行段分配。 PROG1 SEGMENT;PROG1段的开始ASSUME CS:PROG1;PROG1&#xff08;自己命名的&#xff0c;叫啥都可以&#xff…...

Seurat - 聚类教程 (1)

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

Mac 版 Excel 和 Windows 版 Excel的区别

Excel是一款由微软公司开发的电子表格程序&#xff0c;广泛应用于数据处理、分析和可视化等领域。它提供了丰富的功能和工具&#xff0c;包括公式、函数、图表和数据透视表等&#xff0c;帮助用户高效地处理和管理大量数据。同时&#xff0c;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(换源)

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

「递归算法」:二叉树剪枝

一、题目 给你二叉树的根结点 root &#xff0c;此外树的每个结点的值要么是 0 &#xff0c;要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 node 的后代。 示例 1&#xff1a; 输入&#xff1a;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&#xff08;Natural Language Processing&#xff09;是自然语言处理的缩写&#xff0c;是计算机科学和人工智能领域的一个研究方向。NLP致力于使计算机能够理解、处理和生成人类自然语言的能力。通过NLP技术&#xff0c;计算机可以通过识别和理解语言中的文本…...

容器库(5)-std::list

std::forward_list是可以从任何位置快速插入和移除元素的容器&#xff0c;不支持快速随机访问&#xff0c;支持正向和反向的迭代。 本文章的代码库&#xff1a; https://gitee.com/gamestorm577/CppStd 成员函数 构造、析构和赋值 构造函数 可以用元素、元素列表、迭代器…...

配置VMware实现从服务器到虚拟机的一键启动脚本

正文共&#xff1a;1666 字 15 图&#xff0c;预估阅读时间&#xff1a;2 分钟 首先祝大家新年快乐&#xff01;略备薄礼&#xff0c;18000个红包封面来讨个开年好彩头&#xff01; 虽然之前将服务器放到了公网&#xff08;成本增加了100块&#xff0c;内网服务器上公网解决方案…...

第5讲小程序微信用户登录实现

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

Kong 负载均衡

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

基于Chrome插件的Chatgpt对话无损导出markdown格式(Typora完美显示)

Google插件名称为&#xff1a;ChatGPT to MarkDown plus, 下载地址为ChatGPT to MarkDown plus使用方法&#xff1a;见GitHub主页或插件介绍页面https://github.com/thisisbaiy/ChatGPT-To-Markdown-google-plugin/tree/main 我将源代码上传至了GitHub&#xff0c;欢迎star, Is…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...