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

Linux——Json

一 概念

json是一种轻量级,基于文本的,可读的数据交换格式,能够让数据在不同系统(比如前端—后端,服务器—客户端)间方便传递/存储。在编程语言中都内置了处理json数据的方法

二 语法规则

1. 数据格式(键值对+结构化)

编译时后面要加-ljsoncpp

{"name": "小王",      // 字符串值"tel": "13500000000",// 字符串值 "age": 20,           // 数字值"is_vip": true,      // 布尔值"hobbies": ["篮球", "音乐"], // 数组"info": {            // 嵌套对象"city": "北京"     }
}

核心规则:

用{}表示对象(键值对集合),【】表示数组

键key必须是字符串(用双引号包裹)

值value可以是字符串,数字,布尔值,数组,null等

不同键值对用,分隔。最后一个不加

2. 和编程语言的映射

JSon::Value val; 在json这个名字空间中,value这个类的对象是val。这个里面存name/tel等

#include <iostream>
#include <string.h>
#include <string>
#include <jsoncpp/json/json.h>using namespace std;
int main()
{Json::Value val;val["name"] = "小王";//给json对象加键值对  name——小王val["tel"] = "13500000000";char buff[128] = {0};strcpy(buff, val.toStyledString().c_str());cout << buff << endl;Json::Value res;//用来存反序列化后的结果Json::Reader Read;//反序列化工具Read.parse(buff, res);//把buff中的JSON字符串转成JSon::Valuecout << res["name"].asString() << endl;cout << res["tel"].asString() << endl;
}

三 使用JsonCpp库操作JSON

流程:构建JSONM——序列化为字符串——反序列化为JSON——提取数据

1. 构建json对象(Json::Value val)

2. 序列化为字符串(val.toStyledString())

把内存里的 Json::Value数据对象(结构化数据),转成 人类可读的JSON字符串,方便存储 / 传输。返回std::string类型

 toStyledString(格式化序列化,输出带缩进换行,更美观)、toString(紧凑序列化,无多余空白)

  1. c_str() 的作用

    • val.toStyledString().c_str() 返回 const char*,指向 std::string 内部的以 '\0' 结尾的字符数组。
  2. strcpy 的类型匹配

    • strcpy 的原型为 char* strcpy(char* dest, const char* src)
    • buff 的类型是 char[128],在函数调用时 隐式转换为 char*(指向数组首元素的指针)。
    • 风险:若 JSON 字符串长度超过 127 字节,会导致 缓冲区溢出

3. 反序列化为JSON

Json::Reader Read;:创建一个解析器对象,像一个翻译器,负责把文本形式的JSON转化为程序能操作的结构化数据

线程安全:Json::Reader 实例 非线程安全,若在多线程环境中使用,需为每个线程单独创建。
生命周期:通常只需在解析 JSON 前创建,解析完成后可销毁(作用域结束自动释放)。
为什么要反序列化:因为传输 / 存储时只能用字符串,但程序要操作数据,必须转回结构化对象。

Read.parse(...):执行解析操作,将 JSON 字符串(存储在 buff 中)解析为 Json::Value 对象(存储在 res 中),便于后续程序访问 JSON 中的字段。

res:
类型:Json::Value&(引用)。
含义:解析结果将存入此对象。
示例:解析后可通过 res["name"] 访问 "小王"。

为什么res是引用?

Json::Reader::parse 的目的是把输入的 JSON 字符串解析成 Json::Value 类型的结构化数据。函数需要将解析后的结果 “输出” 给调用者,引用是实现这种 “输出” 的高效方式:如果不用引用,而是按值传递(Json::Value res),函数内部对 res 的修改无法传递到函数外部,调用者拿不到解析后的结果,无法实现 “将 JSON 字符串解析为可用对象” 的核心需求。

通过引用传递(Json::Value&),函数直接操作调用者提供的 res 对象,无需拷贝,效率更高,尤其是在处理大型 JSON 数据时,这种性能优势更明显。

4. 按键提取json数据并转化为字符串

 res["name"].asString():
从 Json::Value 对象中,按 键(Key) 提取对应的值,并将其转换为 C++ 的 std::string 类型。

http://www.lryc.cn/news/573434.html

相关文章:

  • 【系统分析师】2017年真题:综合知识-答案及详解
  • JVM(8)——详解分代收集算法
  • 【基础算法】贪心 (一) :简单贪心
  • Python标准库 zlib模块【数据压缩/解压】全面讲解
  • Python元组常用操作方法
  • 什么是跨域问题?后端如何解决跨域问题?
  • MCU量产高效烧录:BootLoader与App合并技巧
  • 【Python】正则表达式中的`^`和`[]`
  • 学c++ cpp 可以投递哪些岗位
  • 从0开始学习计算机视觉--Day02--数据驱动
  • MySQL误删数据急救指南:基于Binlog日志的实战恢复详解
  • Mac Parallels Desktop Kali 2025 代理设置
  • OpenAI与微软的未来合作之路:充满挑战的AI竞赛与共赢
  • YAML 数据格式详解
  • 计算机网络第九章——数据链路层《流量控制和可靠传输》
  • 基于SpringBoot+Uniapp的活动中心预约小程序(协同过滤算法、腾讯地图、二维码识别)
  • Docker镜像制作---指令
  • Qt输入数据验证的方法
  • rent8_wechat-最常用出租屋管理系统-微信小程序
  • 从零开发ComfyUI插件:打造你的AI绘画专属工具
  • 私有规则库:企业合规与安全的终极防线
  • C# 将 Enum枚举转成List,并显示在下拉列表中
  • LINUX621 NFS 同步 ;FTP;samba环境
  • 面试题-ts中的typeof
  • 面试题-把类型为b的值赋给类型为a的变量
  • Laravel 项目中图片上传后无法访问的问题
  • SQL关键字三分钟入门:INSERT INTO —— 插入数据详解
  • Python实现MySQL建表语句转换成Clickhouse SQL
  • 【格与代数系统】偏序关系、偏序集与全序集
  • 2048小游戏C++板来啦!