详细版的Jsoncpp的使用,包括在VS环境下配置
目录
- 准备环境
- VS 环境下配置
- 编译
- 使用
- 基础
- 概述
- Json 数组
- Json 对象
- Jsoncpp 的使用
- Value
- FastWriter
- Reader
- 示例
如果想要 Json 部署在 Linux 上
参考: https://blog.csdn.net/2303_76953932/article/details/142703683?spm=1001.2014.3001.5502
C++中原生不支持
Json
,所以需要导入Jsoncpp
库
准备环境
- 下载
Jsoncpp
从 github 上下载源码
# 这是链接地址
https://github.com/open-source-parsers/jsoncpp
这里我使用的是 git
工具克隆了一份数据下来
git clone git@github.com:open-source-parsers/jsoncpp.git
没有 git
工具就点击 code
,然后点击 Download ZIP
下载 ZIP 文件,然后解压到你想要保存的目录下即可
- 下载 Cmake 工具
- 这个工具是为了编译这个 Jsoncpp 源码编译成动态库,然后需要使用的时候直接使用这个库即可
- 否则需要把这些源码文件和项目文件放一起编译,这样不利于维护,且显得体量过大
VS 环境下配置
- 由于需要在 VS 上写代码,所以需要将源码编译成 VS 环境下的动态库文件
- 因此这里演示如何配置
编译
- 打开 cmake 工具,然后选择对于的文件路径,第一个路径为下载 Jsoncpp 源码后的路径,第二个路径为编译后文件的路径
- 选择好路径后,点击左下角的
configure
按钮,然后弹出对话框,然后选择对于的 VS 版本,也就是自己本地的版本,我的是 VS2022,就选择了这个,其他选项默认即可
-
点击
Finish
后,等待几秒,点击Generate
生成 VS 项目,生成后,去对应的路径点击jsoncpp.sln
打开这个项目 -
找到
jsoncpp_lib
,右击选择生成,此时就能得到我们想要的库文件了
使用
- 由于需要在编写代码时候需要
jsoncpp
对应的头文件,因此配置头文件,有两种方式
- 将头文件放到项目目录下,直接被项目包含引用
- 将头文件放到一个本地固定目录,以后就不再动了,在 VS 项目属性中设置包含这个目录
这里选择第二种
将源码 jsoncpp
中的 include
目录拷贝到本地,注意是源码中的 include
目录,不是生成的 VS 项目中的 include
目录
由于这个 include
目录下有个 json
目录,并且这个目录中才是存放的头文件,所以访问里面的头文件时需要这样
#include <json/json.h>
不建议把头文件移出,这会破坏整个目录结构,存在隐患
- 还要将对应的动态库也放在本地固定目录
-
一个是前面步骤中生成的 vs 项目的
bin
目录下的Debug
目录中的jsoncpp.dll
-
一个是前面步骤中生成的 vs 项目的
lib
目录下的Debug
目录中的jsoncpp.lib
将这两个文件复制到之前 include
同级目录下,新建一个 lib
目录,放在这里面
- 接下来就是在 VS 中配置了
点击小扳手,打开项目属性
指定头文件的路径:点击这个,然后编辑包含目录
填写刚刚拷贝 include
的固定目录路径位置
指定库路径:再编辑库目录
将刚刚拷贝动态库和导入库到的固定目录路径填写进去
还需要告诉 VS 需要加载的动态库是哪一个
填写导入库的名称,也就是 jsoncpp.lib
到这里就配置完成了,如果执行报错不能找到动态库
jsoncpp.dll
只需要将这个文件拷贝到当前 VS 测试项目代码位置即可
测试代码:
#include <iostream>
#include <json/json.h>
using namespace Json;
using namespace std;
int main()
{Value root;root["message"] = "Hello, JsonCpp!";cout << root.toStyledString() << std::endl;return 0;
}
基础
概述
- 是一个完全独立于编程语言的文本格式,用来存储和表示数据的
- Json 是一种数据格式,和语言无关,在什么语言中都可以使用 Json
用途:
- 组织数据(数据序列化),用于数据的网络传输
- 组织数据(数据序列化),写磁盘文件实现数据的持久化存储(一般以. json 作为文件后缀)
Json
中主要有两种数据格式:Json 数组和 Json 对象,并且这两种格式可以交叉嵌套使用
Json 数组
Json
数组使用[]
表示,[]
里边是元素,元素和元素之间使用逗号间隔,最后一个元素后边没有逗号- 一个
Json
数组中支持同时存在多种不同类型的成员,包括:整形、 浮点、 字符串、 布尔类型、json
数组、json
对象、 空值-null
["zhangsan", 176, 20, false,["北京", "上海", "天津", "重庆"],{"Sex": "boy", "father: "Alice"}
]
Json 对象
- Json 对象使用
{}
来描述,每个 Json 对象中可以存储若干个元素,每一个元素对应一个键值对(key:value 结构),元素和元素之间使用逗号间隔,最后一个元素后边没有逗号 - 键值(
key
)必须是字符串,位于同一层级的键值不要重复(因为是通过键值取出对应的value
值) value
值的类型是可选的,可根据实际需求指定,可用类型包括:整形、 浮点、 字符串、 布尔类型、 json 数组、 json 对象、 空值-null
Jsoncpp 的使用
jsoncpp
库中的类被定义到了一个 Json 命名空间中
using namespace Json;
使用 jsoncpp
库解析 json
格式的数据,我们只需要掌握三个类:
Value
类:将json
支持的数据类型进行了包装,最终得到一个Value
类型FastWriter
类:将Value
对象中的数据序列化为字符串Reader
类:反序列化,将json
字符串解析成Value
类型
Value
// 判断保存的类型是否是 string / 数组 / 对象
// 这里这列举了三个,还有其他数据类型,如 int, double....
bool isString() const;
bool isArray() const;
bool isObject() const;
// 将 Value 对象转换为实际类型
Int asInt() const;
JSONCPP_STRING asString() const;
const char* asCString() const
// 对 Json 数组的操作
ArrayIndex size() const;
Value& operator[](ArrayIndex index);
Value& operator[](int index); // 可以直接下标访问
const Value& operator[](ArrayIndex index) const;
const Value& operator[](int index) const;// 根据下标的 index 返回这个位置的 value 值
// 如果没找到这个 index 对应的 value, 返回第二个参数d efaultValue
Value get(ArrayIndex index, const Value& defaultValue) const;
Value& append(const Value& value);
const_iterator begin() const;
const_iterator end() const;
iterator begin();
iterator end();
// 对 json 对象的操作
Value& operator[](const char* key);
Value& operator[](const JSONCPP_STRING& key);
Value& operator[](const StaticString& key);const Value& operator[](const char* key) const;
const Value& operator[](const JSONCPP_STRING& key) const;// 通过key, 得到value值
Value get(const char* key, const Value& defaultValue) const;
Value get(const JSONCPP_STRING& key, const Value& defaultValue) const;
Value get(const CppTL::ConstString& key, const Value& defaultValue) const;// 得到对象中所有的键值
typedef std::vector<std::string> Members;
Members getMemberNames() const;
FastWriter
// 将 Value 对象数据序列化为 string
// 序列化得到的字符串有样式 -> 带换行 -> 方便阅读 -> 适用于写配置文件的时候
std::string toStyledString() const;// 将数据序列化 -> 单行 -> 适用于网络传输的时候
std::string Json::FastWriter::write(const Value& root);
Reader
// Reader 类
bool Json::Reader::parse(const std::string& document,Value& root, bool collectComments = true);参数:- document: json格式字符串- root: 传出参数, 存储了json字符串中解析出的数据- collectComments: 是否保存json字符串中的注释信息// 通过begindoc和enddoc指针定位一个json字符串
// 这个字符串可以是完成的json字符串, 也可以是部分json字符串
bool Json::Reader::parse(const char* beginDoc, const char* endDoc,Value& root, bool collectComments = true);// write的文件流 -> ofstream
// read的文件流 -> ifstream
// 假设要解析的json数据在磁盘文件中
// is流对象指向一个磁盘文件, 读操作
bool Json::Reader::parse(std::istream& is, Value& root, bool collectComments = true);
示例
准备的 Json 数据
[12, 12.34, true, "tom", ["jack", "ace", "robin"], {"sex":"man", "girlfriend":"lucy"}
]
写 Json
void writeJson()
{// 将最外层的数组看做一个 Value// 最外层的 Value 对象创建Value root;// Value 有一个参数为 int 行的构造函数root.append(12); // 参数进行隐式类型转换root.append(12.34);root.append(true);root.append("tom");// 创建并初始化一个子数组Value subArray;subArray.append("jack");subArray.append("ace");subArray.append("robin");root.append(subArray);// 创建并初始化子对象Value subObj;subObj["sex"] = "woman"; // 添加键值对subObj["girlfriend"] = "lucy";root.append(subObj);// 序列化// 有格式的字符串string str = root.toStyledString();// 一整行// FastWriter f;// string str = f.write(root);// 将序列化的字符串写磁盘文件ofstream ofs("test.json");ofs << str;ofs.close();
}
读 Json
void readJson()
{// 1. 将磁盘文件中的 json 字符串读到磁盘文件ifstream ifs("test.json");// 2. 反序列化 -> value 对象Value root;Reader r;r.parse(ifs, root);// 3. 从 value 对象中将数据依次读出if (root.isArray()){// 数组, 遍历数组for (int i = 0; i < root.size(); ++i){// 依次取出各个元素, 类型是 value 类型Value item = root[i];// 判断 item 中存储的数据的类型if (item.isString()){cout << item.asString() << ", ";}else if (item.isInt()){cout << item.asInt() << ", ";}else if (item.isBool()){cout << item.asBool() << ", ";}else if (item.isDouble()){cout << item.asFloat() << ", ";}else if (item.isArray()){ // 数组for (int j = 0; j < item.size(); ++j) {cout << item[j].asString() << ", ";}}else if (item.isObject()){// 对象// 得到所有的keyValue::Members keys = item.getMemberNames();for (int k = 0; k < keys.size(); ++k) {cout << keys.at(k) << ":" << item[keys[k]] << ", ";}}}cout << endl;}
}
上述读数据如此之繁琐,是因为假设我们完全不知道
Json
数据封装的数据格式 但是实际中,我们其实大多是知道这个数据格式的,也就能直接读取对应数据了
说明:参考学习:https://subingwen.cn/
相关文章:

详细版的Jsoncpp的使用,包括在VS环境下配置
目录 准备环境VS 环境下配置编译使用 基础概述Json 数组Json 对象 Jsoncpp 的使用ValueFastWriterReader示例 如果想要 Json 部署在 Linux 上 参考: https://blog.csdn.net/2303_76953932/article/details/142703683?spm1001.2014.3001.5502 C中原生不支持 Json,所…...
开发指南070-3d模型
平台集成了应用于3d展示场景的相关底层,支持fbx和gltf两种模型格式。 样例如下: <div class"fullcontainer"> <div style"width:80%"> <iframe :src"url" width"100%" height"…...

问卷调查毕设计算机毕业设计投票系统SpringBootSSM框架
目录 一、引言 二、需求分析 用户角色: 功能需求: 非功能需求: 三、系统设计 技术选型: 数据库设计: 界面设计: 四、实现步骤 后端实现: …...

JavaWeb三大组件之Servlet
1. Servlet 一、Servlet介绍 1、概念 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成…...
C++设计模式学习详解(23种)
C设计模式学习详解 设计模式是软件开发中常见问题的可复用解决方案。它们不是可以直接转换为代码的成品,而是描述解决问题的通用方法。C 中常用的设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 一、创建型模式 (Creational Patterns) …...
Matlab中实现类属性仅在首次创建类实例时初始化
背景描述: 在自定义类中,需要定义一些属性(标志位)用于触发某些方法,标志位只需要在类对象第一次实例化时赋初值,之后的值需要在特定的地方设置。怎样保证在不同实例中,标志位的值仅在特定的时候改变,其他时候保持不变…...
FLINK SQL动态表连续查询
SQL动态表 在Apache Flink中,动态表是Flink SQL处理流数据的核心概念之一。与静态表(如关系数据库中的传统表)不同,动态表的内容是随时间不断变化的,因为它们能够反映数据流的最新状态。动态表可以看作是对数据流的一…...

C++ | Leetcode C++题解之第468题验证IP地址
题目: 题解: class Solution { public:string validIPAddress(string queryIP) {if (queryIP.find(.) ! string::npos) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur (i 3 ? queryIP.size() : queryIP.find(., last 1));if (cur st…...

每日学习一个数据结构-图
文章目录 图基础一、图的定义二、图的相关概念三、图的分类四、图的使用场景 和图相关的算法一、图的遍历算法二、最短路径算法三、最小生成树算法四、图匹配算法五、网络流算法 图基础 一、图的定义 在数学中,图是描述于一组对象的结构,其中某些对象对…...
kali(专业的渗透测试虚拟机)|kali下载链接地址 |kali安装 |kali部署指南
介绍 kali 是Debian开源linux系统体系下的子分支之一 Debian-kali 扩展:Ubuntu也是Debian开源linux系统体系下的子分支之一 Debian-ubuntu 安装kali 2023.03 稳定版 Index of /kali-images/kali-2023.1/ 安装可以参考他的教程, 写的很详细了…...

中国地级市生态韧性数据及城市生态韧性数据(2000-2022年)
一测算方式: 参考C刊《管理学刊》楚尔鸣(2023)老师的做法,城市生态韧性主要衡量一个城市在面临生态环境系统压力或突发冲击时,约束污染排放、维护生态环境状态和治理能力提升的综合水平。 参考郭海红和刘新民的研究&a…...

应对网络安全挑战:App等保测评的重要性与策略
在全球数字化转型的大潮中,移动应用(App)作为连接人们日常生活与互联网世界的桥梁,其数量与日俱增,功能日趋多样化。与此同时,App背后潜藏的网络安全风险也随之上升,数据泄露、隐私侵犯、恶意软件植入等问题频发&#…...

vue后台管理系统从0到1搭建(4)各组件的搭建
文章目录 vue后台管理系统从0到1搭建(4)各组件的搭建Main.vue 组件的初构 vue后台管理系统从0到1搭建(4)各组件的搭建 Main.vue 组件的初构 根据我们的效果来看,分析一下,我们把左边的区域分为一个组件&am…...

LabVIEW开关磁阻电机特性测量系统
基于LabVIEW软件和特定硬件组件的开关磁阻电机(SRM)特性测量系统,结合多功能数据采集卡,统能够准确地测量并分析SRM的电磁特性,从而支持电机模型的精确建立和性能优化。 项目背景 在工业生产和家用电器领域࿰…...

在当前网络环境中查看所有IPv4与Mac地址的方法
在powershell界面中: # 获取并显示所有网络接口的MAC地址和IPv4地址 Get-NetAdapter | Select-Object -Property Name, MacAddress, Status Get-NetAdapter | Get-NetIPAddress -AddressFamily IPv4 | Select-Object -Property InterfaceAlias, IPAddress, PrefixL…...

CSS @规则(At-rules)系列详解___@charset规则使用方法
CSS 规则(At-rules)系列详解 ___charset规则使用方法 本篇目录: 零、时光宝盒 一、charset规则定义和用法 二、CSS charset语法 三、charset 使用方法例子 1、正确使用方法 2、无效的,错误的使用方法 零、时光宝盒 (https://blog.csd…...

黑马程序员C++核心编程学习笔记
黑马程序员C核心编程学习笔记 一、内存 1.1 内存四区 C程序在执行时,将内存大致分为4个区域:代码区,全局区,栈区,堆区 代码区:存放函数体的的二进制代码,操作系统管理。 🔵特点&a…...

六自由度平台
力姆泰克六自由度平台 安装方便,维护简单 多重机械电气安全保护 向下翻动查看更多 力姆泰克伺服系统集成 全新革命性结构设计与六轴先进伺服控制原理的结合,力姆泰克公司引进国外的专业技术在国内全新推出 全电动六自由度平台。将完全替代市场上原有的…...
【Node.js 下载及npm安装配置】亲测可用
Node.js 下载及npm安装配置 安装nodejs设置安装angular 安装nodejs 下载适用自己系统的node.js,官网:https://nodejs.cn/download/。默认安装即可。查看是否安装成功,node -v,npm -v ,出现版本号即安装成功。 设置 …...
Qt C++设计模式->访问者模式
访问者模式(Visitor Pattern)是一种行为型设计模式,它将操作与对象结构分离,使得你可以在不改变对象结构的前提下定义作用于这些对象的新操作。访问者模式通过引入一个访问者对象,允许你在不修改类的前提下向已有类添加…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...