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

C:JSON-C简介

介绍

        JSON-C是一个用于处理JSON格式数据的C语言库,提供了一系列操作JSON数据的函数。

一、json参数类型

typedef enum json_type {
    json_type_null,
    json_type_boolean,
    json_type_double,
    json_type_int,
    json_type_object,
    json_type_array,
    json_type_string,
} json_type;

二、json API函数

以下是JSON-C中常用的函数介绍:

  • json_object_new_object

创建一个新的json_object对象。

struct json_object* json_object_new_object(void);

  • json_object_object_add

往json对象中添加键值对。

void json_object_object_add(struct json_object *obj, const *key, struct json_object *value);
//obj:要被添加的json_object对象
//key:字段名称
//val:与key关联的json_object对象

  • json_object_new_int

将整数转换成json格式的对象。

struct json_object* json_object_new_int(int32_t i);

  • json_object_get_int

获取json对象的整形数值。

int32_t json_object_get_int(struct json_object *obj);

  • json_object_new_array

创建一个类型为array的json_object新对象。

struct json_object* json_object_new_array(void);

  • json_object_array_add

将json_object对象val添加到obj中。

int json_object_array_add(struct json_object *obj, struct json_object *val);
//obj:要被添加的json_object对象
//val:与添加到obj的json_object对象

  •  json_object_get_array

返回JSON对象的数组值。

struct array_list *json_object_get_array(json_object *obj);

  • json_object_array_length

返回JSON数组中的元素数量。 

int json_object_array_length(json_object *array);

  • json_object_new_string

创建一个类型为string的json_object新对象。

struct json_object* json_object_new_string(const char *s);

  • json_object_get_string

获取json对象的字符串值。

const char *json_object_get_string(struct json_object *obj);

  • json_object_to_file

将JSON对象写入文件中。

int json_object_to_file(char *filename, json_object *obj);

  • json_tokener_parse

将符合json格式的str字符串构造成一个json对象。

struct json_object* json_tokener_parse(const char *str);
//str:包含json数据的字符串

  •  json_object_object_get

 获取JSON对象中给定键的值。

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

  • json_object_object_get_ex

从obj中获取字段为key的json_object对象指针val。(返回值为是否查询到对应键值)

json_bool json_object_object_get_ex(struct json_object* obj, const char *key, struct json_object **value);
//obj:json_object对象
//key:要获取的字段名称
//val:与key关联的json_object对象

  • json_object_get_type

获取JSON对象的类型。

enum json_type json_object_get_type(struct json_object *obj);
//返回类型:
//json_type_null
//json_type_boolean
//json_type_double
//json_type_int
//json_type_object
//json_type_array
//json_type_string

  • json_object_to_json_string

将json对象内容,转成json格式的字符串格式。

const char* json_object_to_json_string(struct json_object *obj);

  • json_object_get

用于获取JSON对象的引用计数,每当引用计数增加一次时,需要调用该函数。它的作用是将JSON对象的引用计数加1,表示有一个新的指针指向该对象。

struct json_object *json_object_get(struct json_object *obj);

  • json_object_put

用于释放JSON对象占用的内存。每当引用计数减少到0时,需要调用该函数。它的作用是将JSON对象的引用计数减1,如果引用计数为0,则释放该对象的内存。

void json_object_put(struct json_object *obj);

注意:在使用json_object_get函数增加引用计数后,必须要对相应的JSON对象使用json_object_put函数释放引用计数,否则会造成内存泄漏。

三、例子

demo案例1(字符串、数字)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <json-c/json.h>int main(void) {//一、创建JSON// 1、创建空json对象struct json_object *obj = json_object_new_object();// 2、往json对象里添加键值对json_object_object_add(obj, "name", json_object_new_string("xiaoming"));json_object_object_add(obj, "age", json_object_new_int(20));// 3、打印json对象的内容和长度printf("%s\n", json_object_to_json_string(obj));printf("%ld\n", strlen(json_object_to_json_string(obj)));//二、解析JSON// 1:根据键名解析出对应的json对象struct json_object *json;json_object_object_get_ex(obj, "name", &json);// 2:根据json对象类型转换成对应的数据json_type type = json_object_get_type(json);// 先获取json对象类型if (json_type_string == type) {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));return 0;
}	

demo案例2(字符串、数组)

#include <stdio.h>
#include <json-c/json.h>int main(void) {struct json_object *obj = json_object_new_object();json_object_object_add(obj, "name", json_object_new_string("xiaoming"));// 创建json数组对象struct json_object *array = json_object_new_array();json_object_array_add(array, json_object_new_int(99));json_object_array_add(array, json_object_new_int(100));// 把数组对象添加到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 i;// 获取json_type_array类型json对象长度int size = json_object_array_length(json);for (i = 0; i < size; i++) {// 根据下标提取json对象struct json_object *j = json_object_array_get_idx(json, i); if (json_type_int == json_object_get_type(j)) {printf("%d\n", json_object_get_int(j));}}}return 0;
}

demo案例3(服务端-客户端之间发送json消息)

server侧

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <json-c/json.h>int main(void) {//第一步:创建socket  // socket():地址族:IPV4协议  套接字类型:流式套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == sockfd) {perror("socket");exit(1);}// 第二步:绑定信息struct sockaddr_in server_info;  // 用于保存服务器的信息(IP PORT)bzero(&server_info, sizeof(struct sockaddr_in)); // 清空server_info.sin_family = AF_INET; // 地址族server_info.sin_port = 7000; // 端口 大于1024都行//server_info.sin_addr.s_addr = 127.0.0.1; // 表示回环IP 用于测试server_info.sin_addr.s_addr = inet_addr("192.168.1.100");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(4);}printf("接受客户端的连接 %d \n", fd);// 第五步:读写操作char buf[1024] = {0};ssize_t size;size = recv(fd, buf, sizeof(buf), 0);if (-1 == size) {perror("recv");exit(5);}// 字符串转换成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));close(fd);  // 关闭TCP连接,不能再接收数据close(sockfd); // 关闭socket,不能再处理客户端的请求// sockfd用于处理客户端连接  fd用于处理客户端的消息return 0;
}       

client

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <json-c/json.h>int main(void) {// 第一步:创建socketint 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("192.168.1.100");if (-1 == connect(sockfd, (struct sockaddr *)&server_info, sizeof(server_info))) {perror("connect");exit(2);}// 第三步:读写数据struct json_object *json = json_object_new_object();json_object_object_add(json, "name", json_object_new_string("xiaoming"));json_object_object_add(json, "age", json_object_new_int(20));const char *buf = json_object_to_json_string(json);if (-1 == send(sockfd, buf, strlen(buf), 0)) {perror("send");exit(3);}printf("字符串 %s 发送成功 长度 %ld \n", buf,strlen(buf));close(sockfd);return 0;
}

四、更多

        如果您需要更详细的介绍或了解其他函数,建议查阅JSON-C官方文档。

相关文章:

C:JSON-C简介

介绍 JSON-C是一个用于处理JSON格式数据的C语言库&#xff0c;提供了一系列操作JSON数据的函数。 一、json参数类型 typedef enum json_type { json_type_null, json_type_boolean, json_type_double, json_type_int, json_type_object, json_type_ar…...

业务幂等性技术架构体系之消息幂等深入剖析

在系统中当使用消息队列时&#xff0c;无论做哪种技术选型&#xff0c;有很多问题是无论如何也不能忽视的&#xff0c;如&#xff1a;消息必达、消息幂等等。本文以典型的RabbitMQ为例&#xff0c;讲解如何保证消息幂等的可实施解决方案&#xff0c;其他MQ选型均可参考。 一、…...

【Go】Go Gin框架初识(一)

1. 什么是Gin框架 Gin框架&#xff1a;是一个由 Golang 语言开发的 web 框架&#xff0c;能够极大提高开发 web 应用的效率&#xff01; 1.1 什么是web框架 web框架体系图&#xff08;前后端不分离&#xff09;如下图所示&#xff1a; 从上图中我们可以发现一个Web框架最重要…...

2024年合肥市科普日小学组市赛第一题题解

9304&#xff1a;数字加密&#xff08;encrypt&#xff09;(1) 【问题描述】 在信息科技课堂上&#xff0c;小肥正在思考“数字加密”实验项目。项目需要加密n个正整数&#xff0c;对每一个正整数x加密的规则是&#xff0c;将x的每一位数字都替换为x的最大数字。例如&#xff0…...

【MySQL实战】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中监控MySQL数据库&#xff0c;如下图&#xff1a; 可以使用mysql_exporter。 以下是一些步骤来设置和配置这个监控环境&#xff1a; 1. 安装和配置Prometheus&#xff1a; - 下载和安装Prometheus。 - 在prometheus.yml中配置MySQL通过添加以下内…...

Wireshark 使用教程:网络分析从入门到精通

一、引言 在网络技术的广阔领域中&#xff0c;网络协议分析是一项至关重要的技能。Wireshark 作为一款开源且功能强大的网络协议分析工具&#xff0c;被广泛应用于网络故障排查、网络安全检测以及网络协议研究等诸多方面。本文将深入且详细地介绍 Wireshark 的使用方法&#x…...

如何在前端给视频进行去除绿幕并替换背景?-----Vue3!!

最近在做这个这项目奇店桶装水小程序V1.3.9安装包骑手端V2.0.1小程序前端 最近&#xff0c;我在进行前端开发时&#xff0c;遇到了一个难题“如何给前端的视频进行去除绿幕并替换背景”。这是一个“数字人项目”所需&#xff0c;我一直在冥思苦想。终于有了一个解决方法…...

使用中间件自动化部署java应用

为了实现你在 IntelliJ IDEA 中打包项目并通过工具推送到两个 Docker 服务器&#xff08;172.168.0.1 和 172.168.0.12&#xff09;&#xff0c;并在推送后自动或手动重启容器&#xff0c;我们可以按照以下步骤进行操作&#xff1a; 在 IntelliJ IDEA 中配置 Maven 或 Gradle 打…...

pytorch张量分块投影示例代码

张量的投影操作 背景 张量投影 是深度学习中常见的操作,将输入张量通过线性变换映射到另一个空间。例如: Y=W⋅X+b 其中: X: 输入张量(形状可能为 (B,M,K),即批量维度、序列维度、特征维度)。W: 权重矩阵((K,N),将 K 维投影到 N 维)。b: 偏置向量(可选,(N,))。Y:…...

Visual Studio 同一解决方案 同时运行 多个项目

方案一 方案二...

VMware中Ubuntu如何连接网络?安排!

一、设置NAT模式 1、关闭Ubuntu虚拟机&#xff1a; 确保Ubuntu已经完全关机&#xff0c;而不是挂起或休眠状态。 2、编辑虚拟网络设置&#xff1a; 在VMware主界面点击“编辑”菜单&#xff0c;选择“虚拟网络编辑器”。 如果需要&#xff0c;选择VMnet8 (NAT模式)并点击“更改…...

使用 Charles 调试 Flutter 应用中的 Dio 网络请求

为了成功使用 Charles 抓取并调试 Flutter 应用程序通过 Dio 发起的网络请求&#xff0c;需遵循特定配置步骤来确保应用程序能够识别 Charles 的 SSL 证书&#xff0c;并正确设置代理服务器。 配置 Charles 以支持 HTTPS 请求捕获 Charles 默认会拦截 HTTP 流量&#xff1b;…...

CMD批处理命令入门(6)——常用的特殊字符

CMD批处理命令入门&#xff08;6&#xff09;——特殊字符 本章内容主要学习要点&#xff1a;重定向符 >、>>命令管道符 |组合命令 &、&&、||转义字符 ^变量引导符 %界定符 "" 本章内容主要学习要点&#xff1a; >、>>重定向符| 命令…...

【跟着官网学技术系列之MySQL】第7天之创建和使用数据库1

前言 在当今信息爆炸的时代&#xff0c;拥有信息检索的能力很重要。 作为一名软件工程师&#xff0c;遇到问题&#xff0c;你会怎么办&#xff1f;带着问题去搜索引擎寻找答案&#xff1f;亦或是去技术官网&#xff0c;技术社区去寻找&#xff1f; 根据个人经验&#xff0c;一…...

next-auth v5 结合 Prisma 实现登录与会话管理

1. 安装依赖 npm install next-auth prisma prisma/client2. 配置 Prisma 模型 在 prisma/schema.prisma 文件中定义 User 和 Account 模型&#xff08;next-auth v5 推荐使用自定义模型&#xff09;。 model User {id String id default(uuid())email …...

WPS excel使用宏编辑器合并 Sheet工作表

使用excel自带的工具合并Sheet表&#xff0c;我们会发现需要开通WPS会员才能使用合并功能&#xff1b; 那么WPS excel如何使用宏编辑器进行合并 Sheet表呢&#xff1f; 1、首先我们要看excel后缀是 .xlsx 还是 .xls &#xff1b;如果是.xlsx 那么 我们需要修改为 .xls 注…...

(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力

文章目录 1、Half Wavelet Attention2、代码实现 paper&#xff1a;HALFWAVELET ATTENTION ON M-NET FOR LOW-LIGHT IMAGE ENHANCEMENT Code&#xff1a;https://github.com/FanChiMao/HWMNet 1、Half Wavelet Attention 传统的图像增强方法主要关注图像在空间域的特征信息&am…...

Linux第二课:LinuxC高级 学习记录day04

6、shell中的语句 6.3、结构性语句 6.3.1、if if…then…fi 1、结构 1&#xff09;基本结构 if 表达式 then 命令表 fi if [ 表达式 ] // 【】两侧有空格 then 命令表 fi 2&#xff09;分层结构 if 表达式 then 命令表1 else 命令表2 fi 3&#xff09;嵌套结构 if …...

occ的开发框架

occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…...

Redis 如何解决大 key 问题

前言 嗨&#x1f44b;&#xff0c;大家好&#xff0c;我是雪荷。做为一个后端开发&#xff0c;Redis 是我们经常接触到的一个非关系行数据库。其对我们系统开发和优化有着举足轻重的作用&#xff0c;但是随着业务和用户迅速增长&#xff0c;也会滋生许多的问题&#xff0c;而大…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...