Ubuntu中 json 打包数据的使用

1.JSON的概念和作用

为了避免不同平台下的字节对齐、类型大小不统一的问题,json库把数据封装成具有一定格式的字符流数据,进行传输。
	 
json格式:把数据与键值一一对应,数据传输双方约定好同一键值,
	 
		使用接口API根据键值操作json对象(json_object)存储或取得数据。
				
	一般使用:
		数据--> (封装)json对象--> String格式 --> ...传输。。。-->String格式-->(解析)json对象-->取得数据
		
		(int/char..)数据,与键值成对存入json对象---------->通过键值从json对象取得数据

2.JSON的安装

在 Ubuntu 中,可以使用 APT 包管理器 在线安装 JSON 解析库。不同的编程语言和应用场景可能需要不同的 JSON 库,这里解释的是一些常见的 JSON 解析工具和库的安装方法。

2.1. 离线安装
1》将安装包移动到家目录中
json-c-0.9.tar.gz(在网上直接查询,有很多这样的下载安装包,也可以后台私信直接找我要)
下载安装包路径:  
	wget http://oss.metaparadigm.com/json-c/json-c-0.9.tar.gz       
    
2》执行解压命令
    sudo tar -xvf json-c-0.9.tar.gz
    
3》移动到解压出来的目录中
    cd json-c-0.9/
    
4》执行命令
    sudo ./configure
    
5》执行命令
    sudo make
    
6》执行命令
    sudo make install
	
7》验证安装是否成功
	只能通过编写程序去验证
	头文件包含#include <json/json.h>
	编译需要链接库-ljson
2.2. 使用apt 安装 jq(命令行 JSON 解析工具)

jq 是一个 轻量级 JSON 处理工具,用于 格式化、过滤、操作 JSON 数据。

🔹 安装 jq

sudo apt update
sudo apt install jq

🔹 测试 jq

echo '{"name": "Alice", "age": 25}' | jq .

🔹 输出

{
  "name": "Alice",
  "age": 25
}
2.3. 安装 libjson-c(C 语言 JSON 解析库)

如果需要在 C 语言 中解析 JSON,可以安装 json-c 库。

🔹 安装 libjson-c

sudo apt update
sudo apt install libjson-c-dev

🔹 检查安装

pkg-config --modversion json-c

🔹 编译 C 代码(使用 -ljson-c 进行链接)

gcc my_json_program.c -o my_json_program -ljson-c
2.4. 安装 python3-json(Python 解析 JSON)

由于 Python 自带 json 模块,可以安装 python3-json 以扩展功能。

🔹 安装 python3-json

sudo apt install python3-json

🔹 在 Python 代码中使用

import json
data = json.loads('{"name": "Alice", "age": 25}')
print(data["name"])  # 输出: Alice
2.5. 安装 rapidjson(C++ 高性能 JSON 解析库)

RapidJSON 是一个 高效的 C++ JSON 库,适用于高性能应用。

🔹 安装 rapidjson

sudo apt install rapidjson-dev

🔹 使用示例

#include <iostream>
#include <rapidjson/document.h>

int main() {
    const char* json = "{\"name\": \"Alice\", \"age\": 25}";
    rapidjson::Document doc;
    doc.Parse(json);
    std::cout << "Name: " << doc["name"].GetString() << std::endl;
    return 0;
}

🔹 编译

g++ my_json_program.cpp -o my_json_program -std=c++11
2.6. 安装 json-glib(GNOME JSON 解析库)

如果需要在 GTK/GNOME 应用 中解析 JSON,可以使用 json-glib

🔹 安装 json-glib

sudo apt install libjson-glib-dev

🔹 检查安装

pkg-config --modversion json-glib-1.0
2.7. 安装 node-json(Node.js JSON 解析)

如果使用 Node.js 处理 JSON,可以安装 node-json 模块。

🔹 安装 Node.js

sudo apt install nodejs npm

🔹 安装 json CLI 工具

npm install -g json

🔹 使用示例

echo '{"name": "Alice", "age": 25}' | json name

📌 输出

Alice

3.JSON的接口函数

(
#include <json/json.h>
注意:在json中所有数据类型(arry、int、string、char)都是一个json对象
)

1》数据的封装(单对象(int、char、string)和数组(arry))
(1)新建对象:

	A.创建一个Json对象:

		struct json_object * json_object_new_object (void)

	B.创建一个Json数组对象:

		struct json_object * json_object_new_array (void)		

	C.销毁json对象

		void json_object_put (struct json_object *obj)
        
(2)json对象的转换(普通类型->json对象):

	1:struct json_object * json_object_new_int (int i)

	2:struct json_object * json_object_new_double (double d)

	3:struct json_object * json_object_new_string (const char *s)

	4:struct json_object * json_object_new_boolean (boolean b)

	5:struct json_object * json_object_new_string_len (const char *s, int len)
	
(3)json对象的处理

	A.普通对象

		添加:void json_object_object_add (struct json_object *obj, const char *key, struct json_object *val)
        //@obj --- 大对象      @key --- 键(取货码)   @val --- 小对象

		删除:void json_object_object_del (struct json_object *obj, const char *key)

		查询:struct json_object * json_object_object_get (struct json_object *obj, const char *key)

		根据key获取:struct json_object * json_object_object_get (struct json_object *obj, const char *key)


	B.数组对象

		获取长度:int json_object_array_length (struct json_object *obj)

		添加:int json_object_array_add (struct json_object *obj, struct json_object *val)

		指定位置添加:int json_object_array_put_idx (struct json_object *obj, int idx, struct json_object *val)

		获取指定位置对象:struct json_object * json_object_array_get_idx (struct json_object *obj, int idx)


(4)json_object To 字符流

		const char * json_object_to_json_string (struct json_object *obj)

2》数据的解析(解析获取到的json格式字符流)     

(1)字符流 To json_object

		struct json_object*	json_tokener_parse(const char *str)

(2)对象获取

	A.普通对象

		根据key获取:struct json_object * json_object_object_get (struct json_object *obj, const char *key)	
                    //@obj --- 大对象   @key --- 键(取货码)

	B.数组对象

		获取指定位置对象:struct json_object * json_object_array_get_idx (struct json_object *obj, int idx)


(3)对象的转换(数据还原)

		bool型:boolean json_object_get_boolean (struct json_object *obj)

		double型:double json_object_get_double (struct json_object *obj)

		整型:int json_object_get_int (struct json_object *obj)

		字符数组:const char * json_object_get_string (struct json_object *obj)

json封装数据代码

/**JSON封装数据的步骤**/
    1》将普通数据类型转换为JSON小对象类型
    2》创建出JSON大对象
    3》将小对象贴上标签,传入到大对象中
    4》将整合好的大对象转换为字符串
        
/************************************************
    程序中需包含该头文件#include <json/json.h>
    编译时需链接对应的库 -ljson
************************************************/

/**JSON解析数据的步骤**/
    1》将字符串转换为JSON大对象
    2》根据标签从JSON大对象中提取出JSON小对象
    3》将JSON小对象转换为普通数据类型
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <json/json.h>

struct user{
    int ID;
    char name[20];
    char pwd[20];
};

int main(void)
{
    /*JSON封装数据*/
    //准备好原始数据
    struct user send_user = {1,"Tonly","123456"};

    //将普通数据类型转换为JSON小对象类型
    struct json_object * obj_ID	    = json_object_new_int (send_user.ID);
    struct json_object * obj_name   = json_object_new_string (send_user.name);
    struct json_object * obj_pwd    = json_object_new_string (send_user.pwd);

    //创建出JSON大对象
    struct json_object * object	    = json_object_new_object ();

    //将小对象贴上标签,传入到大对象中
    json_object_object_add (object, "ID_JSON", obj_ID);
    json_object_object_add (object, "name_JSON", obj_name);
    json_object_object_add (object, "pwd_JSON", obj_pwd);

    //将整合好的大对象转换为字符串
    const char * str = json_object_to_json_string (object);

    printf("JSON封装后的结果为:\n");
    printf("%s\n",str);

    printf("==============================================\n");

    /*JSON解析数据*/
    struct user recv_user;

    //将字符串转换为JSON大对象
    struct json_object*	objects	    = json_tokener_parse(str);

    //根据标签从JSON大对象中提取出JSON小对象
    struct json_object * objs_ID    = json_object_object_get (objects, "ID_JSON");
    struct json_object * objs_name  = json_object_object_get (objects, "name_JSON");
    struct json_object * objs_pwd   = json_object_object_get (objects, "pwd_JSON");
    
    //将JSON小对象转换为普通数据类型
    recv_user.ID = json_object_get_int (objs_ID);
    strcpy(recv_user.name, json_object_get_string (objs_name));
    strcpy(recv_user.pwd, json_object_get_string (objs_pwd));

    printf("JSON解析后的结果为:\n%d,%s,%s",recv_user.ID,recv_user.name,recv_user.pwd);

    return 0;
}

出现报错:

#问题:
farsight@Ubuntu18:~/shared/Network/day05/json$ ./json
./json: error while loading shared libraries: libjson.so.0: cannot open shared object file: No such file or directory

在这里插入图片描述

#解决办法:
     1》打开配置文件
         sudo vim /etc/ld.so.conf.d/my.conf
         
     2》在新一行加上以下路径    
         /usr/lib(你的json安装在哪个文件夹就配置地址在哪)

     3》使配置文件生效
         sudo ldconfig
	    
    /**运行结果**/        
    farsight@Ubuntu18:~/shared/Network/day05/json$ ./json
    JSON封装后的结果为:
    { "ID_JSON": 1, "name_JSON": "Tonly", "pwd_JSON": "123456" }

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/976154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网页制作08-html,css,javascript初认识のhtml使用框架结构,请先建立站点!

框架一般由框架集和框架组成。 框架集就像一个大的容器&#xff0c;包括所有的框架&#xff0c;是框架的集合。 框架是框架集中一个独立的区域用于显示一个独立的网页文档。 框架集是文件html&#xff0c;它定义一组框架的布局和属性&#xff0c;包括框架的数目&#xff0c;框架…

应无所住而生其心:心灵的自在与解脱

在快节奏、高压力的现代社会中&#xff0c;人们常常感到心灵被各种琐事和追求所束缚。如何找到内心的平静与自由&#xff0c;成为了许多人寻求的答案。“应无所住而生其心”这一出自《金刚经》的理念&#xff0c;为我们提供了一条通往心灵解放的道路。 一、核心含义 “应无所…

edge浏览器将书签栏顶部显示

追求效果&#xff0c;感觉有点丑&#xff0c;但总归方便多了 操作路径&#xff1a;设置-外观-显示收藏夹栏-始终

【K8s】专题十六(2):Kubernetes 包管理工具之 Helm 使用

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

【uni-app】对齐胶囊容器组件

代码碎片 <template><div><view :style"{ height: ${statusBarHeight}px }"></view><viewclass"":style"{height: ${menuButtonHeight menuButtonPadding * 2}px,width: ${menuButtonInfo.left}px,}"><slot …

C语言基本知识------指针(4)

1. 回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数 时&#xff0c;被调⽤的函数就是回调函数。 void qsort(void base,//指针…

Mysql的数值类型

文章目录 数值类型字符串类型日期类型 数值类型 字符串类型 日期类型

C/C++后端开发面经

字节跳动 客户端开发 实习 一面(50min) 自我介绍是否愿意转语言,是否只愿意搞后端选一个项目来详细谈谈HTTP和HTTPS有什么区别?谈一下HTTPS加密的具体过程&#xff1a; 非对称加密 对称加密 证书认证的方式 非对称加密是为了保证对称密钥的安全性。 对称…

图神经网络实战(24)——基于LightGCN构建推荐系统

图神经网络实战&#xff08;24&#xff09;——基于LightGCN构建推荐系统 0. 前言1. Book-Crossing 数据集介绍2. Book-Crossing 数据集预处理3. 构建 LightGCN 架构3.1 LightGCN 架构2. 实现 LightGCN3.3 损失函数3.4 模型训练与测试3.5 生成推荐 小结系列链接 0. 前言 推荐系…

NTS库学习,找bug中......

引用库&#xff1a; 代码如下&#xff1a; using GeoAPI.Geometries; using NetTopologySuite.Features; using NetTopologySuite.Geometries; using NetTopologySuite; using NetTopologySuite.IO; using Coordinate NetTopologySuite.Geometries.Coordinate; using GeoAPI…

图像处理案例06 OCR应用

OCR应用 1 OCR读取账单1.1 背景及思路1.2 代码 1 OCR读取账单 1.1 背景及思路 思路 目标是读取图片中账单的信息。首先要截取图片上的账单&#xff0c;考虑到账单并非都是整齐摆放&#xff0c;为了保持算法的通用性&#xff0c;通过透视变换对扣取的账单摆正&#xff0c;然后调…

TVS管学习记录

文章目录 前言一、TVS是什么&#xff1f;二、TVS关键参数1.反向截至电压**实际意义** 2.钳位电压**定义与作用****选择依据** **4. 实际应用示例****场景&#xff1a;通信端口的ESD保护** 3.反向截至电压和钳位电压的关联和区别**. 小结** 三、实际应用电路举例总结 前言 TVS管…

java编译和c语言编译区别

java import和c include区别 AI回答 Java中的import关键字和C语言中的#include预处理指令在功能和用途上有显著的区别。以下是它们之间的一些主要差异&#xff1a; ‌作用机制‌&#xff1a; ‌Java import‌&#xff1a;import关键字用于从其他包或类中导入类型&#xff08;如…

conda 基本命令

1、查询当前所有的环境 conda env list 2、创建虚拟环境 conda create -n 环境名 [pythonpython版本号] 其中[pythonpython版本号]可以不写 conda create -n test python3.12 我们输入conda env list看到我们的环境创建成功了&#xff0c;但是发现他是创建在我们默认的C盘的…

关于单调栈问题的本质的思考

单调栈问题的本质在于利用序列中的单调性&#xff0c;通过维护一个有序的栈结构&#xff0c;高效地排除不可能的解&#xff0c;从而快速确定每个元素的前后特定条件元素。其核心可总结为以下几点&#xff1a; 维护单调性&#xff0c;减少无效比较 通过保持栈内元素的单调递增或…

Unity汽车笔记

汽车的移动和转向 我们知道&#xff0c;汽车的前进后退是变速运动。按w&#xff0c;汽车开始加速&#xff0c;到最大速度后保持匀速&#xff0c;松开w&#xff0c;汽车受到阻力加速。如果按s减速&#xff0c;则以更大的加速度减速。后退反之。 按A/D时前轮偏转。只有前进后退…

RT-Thread+STM32L475VET6——USB鼠标模拟

文章目录 前言一、板载资源二、具体步骤1.配置icm20608传感器2.打开CubeMX进行USB配置3. 配置USB3.1 打开USB驱动3.2 声明USB3.3 剪切stm32xxxx_hal_msp.c中的void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)和void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)函数至board.c3.…

鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影)

鸿蒙开发深入浅出04&#xff08;首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影&#xff09; 1、效果展示2、ets/pages/Home.ets3、ets/views/Home/SearchBar.ets4、ets/views/Home/NavList.ets5、ets/views/Home/TileList.ets6、ets/views/Home/PlanList.ets7、后端…

SOME/IP-SD -- 协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型&#xff0c;凭借其强大的自然语言处理能力和丰富的知识储备&#xff0c;迅速成为业界关注的焦点。无论是文本生…