当前位置: 首页 > 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…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...

SQL进阶之旅 Day 22:批处理与游标优化

【SQL进阶之旅 Day 22】批处理与游标优化 文章简述&#xff08;300字左右&#xff09; 在数据库开发中&#xff0c;面对大量数据的处理任务时&#xff0c;单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”&#xff0c;深入探讨如何通过批量操作和游标技术提…...

Spring事务传播机制有哪些?

导语&#xff1a; Spring事务传播机制是后端面试中的必考知识点&#xff0c;特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发&#xff0c;全面剖析Spring事务传播机制&#xff0c;帮助你答得有…...