JsonCpp的核心类及核心函数使用汇总

文章目录

  • JsonCpp的核心类及核心函数使用汇总
    • 一、前言
    • 二、JsonCpp 核心类介绍
    • 三、`Value` 类函数解析
      • 1. 值获取函数(`asxxx` 系列 )
      • 2. 值类型判断函数(`isxxx` 系列 )
      • 3. 数组操作函数
      • 4. 对象操作函数
      • 5. 运算符重载
      • 6. 迭代器
      • 7. JSON 转化
    • 四、Json::Reader 和 Json::Writer 类
      • 1. Json::Reader 类:反序列化 - 解析函数
        • (一)核心作用
        • (二)`parse` 函数重载说明
        • (三)使用示例
      • 3.Json::Writer 类:序列化 - 写入
        • (一)核心作用
        • (二)常用子类及特点
          • 1. `Json::StyledWriter`
          • 2. `Json::FastWriter`
        • (三)使用示例(结合读写 )

JsonCpp的核心类及核心函数使用汇总

一、前言

在 C++ 开发中,处理 JSON 数据是常见需求,JsonCpp 是个实用的 C++ JSON 解析库。本文总结 JsonCpp 中常见的核心类和函数的使用,帮助掌握 JSON 数据处理。

二、JsonCpp 核心类介绍

说明
Json::Value类型支持类,可解析所有 JSON 支持类型(bool、字符串、浮点数、对象、数组等 );支持用 isxxx 判断类型、asxxx 转换类型,能按 JSON 字段格式提取值(如 asString 取字符串节点值 )
Json::Reader可解析文件、文件流、字符串内存,结果存入 Json::Value;支持用 Features 定义 JSON 严格等级,影响解析失败时函数返回逻辑
Json::Writer基类,用于将数据转为字符串流(内存 )并可写入文件;需用实现子类(如 Json::FastWriter 压缩 JSON 后写入,Json::StyledWriter 按自定义格式输出 )

三、Value 类函数解析

1. 值获取函数(asxxx 系列 )

asxxx 函数用于类型转换,前提是 Value 存储对应类型数据,否则可能出问题,建议先用 isxxx 判断。示例:

#include <json/json.h>
#include <iostream>
using namespace std;int main() {Json::Value val;val = "Hello JsonCpp";if (val.isString()) {string str = val.asString(); cout << "字符串值:" << str << endl;}val = 123;if (val.isInt()) {int num = val.asInt(); cout << "整数值:" << num << endl;}return 0;
}

常用 asxxx 函数:

函数功能
const char* asCString() const获取 C 风格字符串
string asString() const转成 std::string
Int asInt() constint 类型(Int 一般是 int 别名 )
UInt asUInt() constunsigned int 类型
double asDouble() constdouble 类型
bool asBool() constbool 类型

2. 值类型判断函数(isxxx 系列 )

  • 用于判断 Value 存储数据类型,精准操作 JSON 数据关键。函数及功能:
函数功能
bool isNull() const是否为 null 类型
bool isBool() const是否为 bool 类型
bool isInt() const是否为 int 类型
bool isInt64() const是否为 int64_t 类型
bool isUInt() const是否为 unsigned int 类型
bool isUInt64() const是否为 uint64_t 类型
bool isIntegral() const是否为整数类型(intuint 等整数相关类型 )
bool isDouble() const是否为 double 类型
bool isNumeric() const是否为数值类型(整数、浮点数 )
bool isString() const是否为字符串类型
bool isArray() const是否为数组类型(JSON 数组 []
bool isObject() const是否为对象类型(JSON 对象 {}
  • 示例:
Json::Value val;
val = Json::arrayValue; 
if (val.isArray()) {cout << "是数组类型" << endl;
}
val = Json::objectValue;
if (val.isObject()) {cout << "是对象类型" << endl;
}

3. 数组操作函数

  • Json::Value 数组操作通过一系列函数实现,ArrayIndexunsigned int 类型,代表数组索引。
函数功能
Value get(ArrayIndex index, const Value& defaultValue) const按索引 index 取数组元素,无则返回 defaultValue
bool isvalidIndex(ArrayIndex index) const判断索引 index 是否有效
Value& append(Value& value)添加元素到数组末尾
bool insert(ArrayIndex index, const Value& newValue)在索引 index 处插入元素
bool removeIndex(ArrayIndex index, Value* removed)删除索引 index 元素,removed 存删除元素
bool empty() const判断数组是否为空(对象为空或 null 也返回 true
void clear()清空数组元素(对象则删除所有成员 )
void resid(ArrayIndex newSize)调整数组大小到 newSize
  • 示例:
Json::Value arr(Json::arrayValue);
arr.append("元素1");
arr.append(123);
// 遍历数组
for (Json::ArrayIndex i = 0; i < arr.size(); ++i) {cout << "数组元素:" << arr[i] << endl;
}
// 插入元素
arr.insert(1, "插入元素");
// 删除元素
Json::Value removed;
arr.removeIndex(2, &removed);
cout << "删除元素:" << removed << endl;

4. 对象操作函数

  • 处理 JSON 对象(键值对形式 ),Members 一般是 vector<string> 类型,存对象成员名。
函数功能
Members getMemberNames() const获取对象所有键名,返回 vector<string>
bool isMember(const char* key) const判断是否有 key 对应的成员
void removeMember(const char* key)删除 key 对应的成员
Value get(const char* key, const Value& defaultValue) constkey 取成员值,无则返回 defaultValue

示例:

Json::Value obj(Json::objectValue);
obj["name"] = "JsonCpp";
obj["version"] = 1.0;
// 获取成员名
Json::Value::Members members = obj.getMemberNames();
for (const auto& member : members) {cout << "成员名:" << member << ",值:" << obj[member] << endl;
}
// 判断成员
if (obj.isMember("name")) {cout << "存在 name 成员" << endl;
}
// 删除成员
obj.removeMember("version");

5. 运算符重载

Json::Value 重载 [] 运算符,方便像数组或对象一样访问元素:

  • 数组访问:Value& operator[](ArrayIndex index); ,按索引操作数组元素。
  • 对象访问:Value& operator[](const char* key); ,按键操作对象成员。

示例:

Json::Value root;
root["array"][0] = "数组元素"; 
root["object"]["key"] = "对象值"; 
cout << "数组元素:" << root["array"][0] << endl;
cout << "对象值:" << root["object"]["key"] << endl;

6. 迭代器

遍历 Json::Value (数组或对象 ),分常量迭代器(只读 )和普通迭代器(可修改 )。

函数功能
const_iterator begin() const常量迭代器起始,只读
const_iterator end() const常量迭代器结束
iterator begin()普通迭代器起始,可修改
iterator end()普通迭代器结束

示例:

Json::Value arr(Json::arrayValue);
arr.append("元素1");
arr.append("元素2");
// 常量迭代器遍历(只读)
for (Json::Value::const_iterator it = arr.begin(); it != arr.end(); ++it) {cout << "常量遍历:" << *it << endl;
}
// 普通迭代器遍历(可修改)
for (Json::Value::iterator it = arr.begin(); it != arr.end(); ++it) {*it = "修改后_" + it->asString(); cout << "修改遍历:" << *it << endl;
}

7. JSON 转化

Json::Value 可转成字符串,string Value::toStyledString() const 生成带缩进格式化字符串,方便查看;若要无格式化或自定义输出,用 Json::Writer 子类(如 FastWriter 紧凑格式)。示例:

Json::Value val;
val["name"] = "Test";
val["age"] = 20;
string styledStr = val.toStyledString(); 
cout << "格式化字符串:\n" << styledStr << endl;Json::FastWriter fastWriter;
string fastStr = fastWriter.write(val); 
cout << "快速输出字符串:" << fastStr << endl;

四、Json::Reader 和 Json::Writer 类

在 JsonCpp 库里,Json::Reader 负责把 JSON 格式的文本数据解析成 Json::Value 对象(反序列化),Json::Writer 及其子类则用于把 Json::Value 对象转换成 JSON 格式的字符串(序列化 )。

1. Json::Reader 类:反序列化 - 解析函数

(一)核心作用

把 JSON 格式的字符串、文件流等数据,解析成 Json::Value 类型的对象,让程序能像操作普通数据结构(对象、数组等 )一样处理 JSON 内容。

(二)parse 函数重载说明

Json::Reader 提供了 3 个常用的 parse 重载函数,适配不同输入场景:

// 1. 解析 std::string 类型的 JSON 文本
bool parse(const std::string& document, Value& root, bool collectComments = true);  // 2. 解析字符数组形式的 JSON 文本(beginDoc 起始、endDoc 结束 )
bool parse(const char* beginDoc, const char* endDoc, Value& root, bool collectComments = true); // 3. 解析输入流(如文件流 std::ifstream )里的 JSON 内容
bool parse(Istream& is, Value& root, bool collectComments = true);  
  • 参数说明
    • document / beginDoc+endDoc / is:待解析的 JSON 数据源,分别对应字符串、字符数组范围、输入流。
    • root:解析结果会存储到这个 Json::Value 对象里,后续通过它访问 JSON 数据。
    • collectComments:是否收集 JSON 里的注释,默认 true 。一般场景不用刻意关注,保持默认即可;若要严格忽略注释提升解析效率,可设为 false
  • 返回值bool 类型,true 表示解析成功,false 表示解析失败(如 JSON 格式错误 )。
(三)使用示例

假设我们有一段 JSON 格式的字符串,想解析它:

#include <json/json.h>
#include <iostream>
#include <string>
using namespace std;int main() {// 模拟从文件/网络获取的 JSON 字符串string json_data = "{\"name\":\"JsonCpp\",\"version\":1.0,\"features\":[\"easy\",\"powerful\"]}";  Json::Reader reader; Json::Value root;   // 调用 parse 解析,结果存入 rootbool parseResult = reader.parse(json_data, root);  if (parseResult) {// 解析成功,访问 root 里的数据cout << "name: " << root["name"].asString() << endl;cout << "version: " << root["version"].asDouble() << endl;// 遍历数组const Json::Value& features = root["features"];for (Json::ArrayIndex i = 0; i < features.size(); ++i) {cout << "feature " << i << ": " << features[i].asString() << endl;}} else {// 解析失败,可打印错误信息(需额外处理,JsonCpp 可获取错误详情 )cerr << "JSON 解析失败!" << endl;}return 0;
}

关键逻辑

  1. 先创建 Json::Reader 对象 reader 和用于存储结果的 Json::Value 对象 root
  2. 调用 reader.parse 传入 JSON 字符串 json_dataroot ,尝试解析。
  3. 根据 parse 返回值判断是否成功,成功则通过 root[] 运算符 + asxxx 函数(如 asStringasDouble )访问数据;失败可做错误处理。

如果要从文件解析 JSON,示例如下(基于第 3 个 parse 重载 ):

#include <json/json.h>
#include <fstream>
#include <iostream>
using namespace std;int main() {ifstream ifs("test.json"); if (!ifs.is_open()) {cerr << "无法打开文件 test.json" << endl;return -1;}Json::Reader reader;Json::Value root;// 解析文件流bool parseResult = reader.parse(ifs, root);  ifs.close();if (parseResult) {// 成功解析,处理 root 数据...cout << "解析文件内容成功,name: " << root["name"].asString() << endl;} else {cerr << "解析文件 JSON 失败!" << endl;}return 0;
}

这里利用 std::ifstream 打开文件,把文件流传给 reader.parse ,实现从文件解析 JSON 。

3.Json::Writer 类:序列化 - 写入

(一)核心作用

Json::Writer 是抽象基类,本身不能直接用,需用它的子类(如 Json::StyledWriterJson::FastWriter ),把 Json::Value 对象转换成 JSON 格式的字符串,用于输出到日志、网络、文件等。

(二)常用子类及特点
1. Json::StyledWriter
  • 功能:生成格式化、带缩进的 JSON 字符串,可读性强,适合调试、日志打印等场景。
  • 示例代码
Json::Value root;
root["name"] = "StyledWriter";
root["score"] = 95;Json::StyledWriter styled_writer;
// 调用 write 生成格式化 JSON 字符串
string styledJson = styled_writer.write(root);  cout << "StyledWriter 输出:\n" << styledJson << endl;

输出效果

{"name": "StyledWriter","score": 95
}

缩进和换行让 JSON 结构清晰,方便人看。

2. Json::FastWriter
  • 功能:生成紧凑、无缩进的 JSON 字符串,体积小,适合网络传输、存储到文件(追求小体积 )等场景。
  • 示例代码
Json::Value root;
root["name"] = "FastWriter";
root["score"] = 95;Json::FastWriter fast_writer;
// 调用 write 生成紧凑 JSON 字符串
string fastJson = fast_writer.write(root);  cout << "FastWriter 输出:\n" << fastJson << endl;

输出效果

{"name":"FastWriter","score":95}

去掉了缩进和多余空格,字符串更短小。

(三)使用示例(结合读写 )

完整演示“解析 JSON 字符串 → 操作数据 → 重新序列化为 JSON 字符串”流程:

#include <json/json.h>
#include <iostream>
#include <string>
using namespace std;int main() {// 1. 准备 JSON 字符串string jsonStr = "{\"name\":\"Original\",\"age\":20}";// 2. 反序列化:用 Json::Reader 解析Json::Reader reader;Json::Value root;reader.parse(jsonStr, root);// 3. 操作 JSON 数据(修改、新增 )root["name"] = "Modified";  root["gender"] = "Male";  // 4. 序列化:用不同 Writer 输出// 4.1 StyledWriter 输出格式化结果Json::StyledWriter styledWriter;string styledResult = styledWriter.write(root);cout << "StyledWriter 结果:\n" << styledResult << endl;// 4.2 FastWriter 输出紧凑结果Json::FastWriter fastWriter;string fastResult = fastWriter.write(root);cout << "FastWriter 结果:\n" << fastResult << endl;return 0;
}

输出结果

StyledWriter 结果:
{"age": 20,"gender": "Male","name": "Modified"
}
FastWriter 结果:
{"age":20,"gender":"Male","name":"Modified"}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt写入excel

1.tableView导出到excel 点击导出函数按钮、发送sendMessage信号&#xff08;信号名称&#xff0c;对象&#xff0c;数据&#xff09; void HydroelectricPowerPluginImpl::exportTableViewSelectedRows(QTableView* tableView, QWidget* parent) {if (!tableView || !tableVie…

OSCP - Proving Grounds - DC - 1

主要知识点 drupal 7 RCEfind SUID提权 具体步骤 nmap起手,80端口比较有意思&#xff0c;安装了 Drupal 7 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-17 14:23 UTC Nmap scan report for 192.168.57.193 Host is up (0.00087s latency). Not shown: 65531 cl…

仿小红书交流社区(微服务架构)

文章目录 framework - 平台基础设施starter - jacksoncommonexceptionresponseutil starter - content 全局上下文distributed - id - generate - 分布式 IdSnowflake - 基于雪花算法生成 IdSegment - 基于分段式生成 Id OSS - 对象存储KV - 短文本存储笔记评论 user - 用户服务…

大模型开源技术解析 4.5 的系列开源技术解析:从模型矩阵到产业赋能的全栈突破

提示&#xff1a;本篇文章 1300 字&#xff0c;阅读时间&#xff1a;5分钟。 前言 6 月 30 日&#xff0c;百度正式开源文心大模型 4.5 系列&#xff0c;这一动作不仅兑现了 2 月发布会上的技术承诺&#xff0c;更以 10 款全维度模型矩阵刷新了国内开源模型的技术边界。从学术…

[6-02-01].第05节:配置文件 - YAML配置文件语法

SpringBoot学习大纲 一、YAML语法 1.1.概述&#xff1a; 1.YAML是一种数据序列化格式&#xff1b;2.它是以数据为中心3.容易阅读&#xff0c;容易与脚本语言交互,如下图所示&#xff1a; 1.2.基本语法 1.key: value&#xff1a;kv之间有空格2.使用缩进表示层级关系3.缩进时…

FPGA学习

一、module : 定义&#xff1a; 是构建数字系统的基本单元&#xff0c;用于封装电路的结构和行为。它可以表示从简单的逻辑门到复杂的处理器等任何硬件组件。 1. module 的基本定义 module 模块名 (端口列表);// 端口声明input [位宽] 输入端口1;output [位宽] 输出端口1;ino…

26-计组-存储器与Cache机制

一、存储器与局部性原理 1. 局部性原理 基础概念&#xff1a; 时间局部性&#xff1a;一个存储单元被访问后&#xff0c;短时间内可能再次被访问&#xff08;例如循环变量&#xff09;。空间局部性&#xff1a;一个存储单元被访问后&#xff0c;其附近单元可能在短时间内被访…

I/O 线程 7.3

前言 以下&#xff1a; 概述 1.基础 2.代码演示 3.练习 4.分析题 1.基础 一、线程基础概念 并发执行原理 通过时间片轮转实现多任务"并行"效果 实际为CPU快速切换执行不同线程 线程 vs 进程 线程共享进程地址空间&#xff0c;切换开销更小 进程拥有独立资源&am…

MySQL JSON数据类型完全指南:从版本演进到企业实践的深度对话

&#x1f4ca; MySQL JSON数据类型完全指南&#xff1a;从版本演进到企业实践的深度对话 在当今数据驱动的时代&#xff0c;MySQL作为最受欢迎的关系型数据库之一&#xff0c;不断演进以满足现代应用的需求。JSON数据类型的引入&#xff0c;让MySQL在保持关系型数据库优势的同时…

BI × 餐饮行业 | 以数据应用重塑全链路业务增长路径

在竞争激烈的餐饮行业中&#xff0c;数据已成为企业保持竞争力的关键资产。通过深入分析顾客数据&#xff0c;餐饮企业能够洞察消费者的需求和偏好&#xff0c;从而提供更加精准和个性化的服务。此外&#xff0c;利用数据优化业务管理&#xff0c;降低成本&#xff0c;并提高运…

【学习线路】机器学习线路概述与内容关键点说明

文章目录 零、机器学习的企业价值一、基础概念1. 机器学习定义2. 学习类型3. 学习范式 二、核心算法与技术1. 监督学习2. 无监督学习3. 模型评估与优化 三、深度学习与神经网络1. 神经网络基础2. 深度学习框架3. 应用场景 四、工具与实践1. 数据处理2. 模型部署3. 机器学习的生…

Linux 命令:cp

Linux cp 命令详细教程 cp 是 Linux 系统中最常用的命令之一&#xff0c;用于复制文件或目录。它可以将源文件/目录复制到指定的目标位置&#xff0c;支持批量复制、强制覆盖、保留文件属性等功能。下面详细介绍其用法。资料已经分类整理好&#xff1a;https://pan.quark.cn/s…

java分页插件| MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践

MyBatis-Plus分页 vs PageHelper分页&#xff1a;全面对比与最佳实践 一、分页技术概述 在Java持久层框架中&#xff0c;分页是高频使用的功能。主流方案有&#xff1a; MyBatis-Plus分页&#xff1a;MyBatis增强工具的内置分页方案PageHelper分页&#xff1a;独立的MyBatis…

PROFINET转MODBUS TCP网关在机械臂通信操作中的应用研究

在特定的汽车零部件生产工厂焊接生产线上&#xff0c;机械臂被应用于焊接作业&#xff0c;其控制体系基于Profinet协议。同时&#xff0c;工厂的自动化控制体系以西门子S7-1200PLC为核心&#xff0c;通过ModbusTCP协议实现数据交换。为实现焊接过程的自动化控制以及生产数据的实…

Mac中如何Chrome禁用更新[update chflags macos]

写在前面 在 macOS 系统中&#xff0c;系统更新提示的小红点常常让人不胜其扰。 尤其是当你希望保持现有系统的稳定性&#xff0c;或因兼容性问题暂不想升级时&#xff0c;这个小红点就像一个顽固的提醒。 - windowsMac版直接删除更新程序, 有效 cd ~/Library/Google/Googl…

LoRA使用-多个LoRA

LoRA的风格分类 不用去记它有什么很特别的风格&#xff0c;简单来说基础模型就像一个全能画手&#xff0c;什么都能画&#xff0c;而LoRA是在某个风格中经过特训的它的一个分身。使得它更精通该风格。 关于LoR风格分类&#xff1a;提示词撰写公式 Checkpoint&LoRA对比 训…

牛客刷题 — 【排序】[NOIP2012] 国王的游戏(高精度结构体排序)

1.题面&#xff1a;传送门 2. 思路&#xff1a; 相邻的两个大臣的先后顺序只会互相影响&#xff0c;并不会影响其他人的金币数。 假设前 i-1 个人左手上的数乘积为 s 。 ① 若 A 大臣排在B 大臣的前面&#xff0c;则&#xff1a; s 此时的金币数最大值为 。 ② 若B大臣排…

grpc 和限流Sentinel

基于gRPC的微服务通信模块技术方案书 1. 总体架构设计 #mermaid-svg-TiN9cudEfW5mCWHm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TiN9cudEfW5mCWHm .error-icon{fill:#552222;}#mermaid-svg-TiN9cudEfW5mCWHm…

经典灰狼算法+编码器+双向长短期记忆神经网络,GWO-Transformer-BiLSTM多变量回归预测,作者:机器学习之心!

经典灰狼算法编码器双向长短期记忆神经网络&#xff0c;GWO-Transformer-BiLSTM多变量回归预测&#xff0c;作者&#xff1a;机器学习之心&#xff01; 目录 经典灰狼算法编码器双向长短期记忆神经网络&#xff0c;GWO-Transformer-BiLSTM多变量回归预测&#xff0c;作者&#…

VGG Image Annotator (VIA):一款免费的数据标注软件介绍与使用

VGG Image Annotator (VIA)&#xff1a;一款免费的数据标注软件介绍与使用 在计算机视觉领域&#xff0c;数据标注是训练机器学习模型的基础步骤之一&#xff0c;而标注工具的选择直接影响标注的效率和准确性。众多标注工具中&#xff0c;VGG Image Annotator (VIA) 是一个开源…