json-cpp的下载与使用

1.json-cpp 的概要

JSON 是一种数据交换格式,常用于网络应用编程中的序列和反序列化。

JSON 的数据类型只有如下几种:

  • 对象,使用 {} 包含
  • 数组,使用 [] 包含
  • 字符串,使用 "" 包含
  • 数字(包含整数和浮点),直接使用就行
  • 布尔值,truefalse
  • 空值,null

而一份 .json 文件内就包含由上述数据类型构成的一份文档,当需要发送时就压缩和序列化成字符串发送出去,对端读取后再进行反序列进行阅读。

json-cpp 可用于实现 json 格式的序列化和反序列化,主要依靠三个类和少量函数。您可以使用 sudo yum install jsoncpp-devel 下载内部相关文件,也可以去克隆官方 git 仓库(https://github.com/open-source-parsers/jsoncpp)。

2.json-cpp 的使用

由于比较简单,这里直接上代码进行使用。

//使用 jsoncpp 的相关接口
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <cstring>
#include <jsoncpp/json/json.h>int main()
{//1.制作 JSON 内容std::cout << "1.制作 JSON 内容" << std::endl;//创建一个空的 JSON 对象Json::Value root;//添加键值对root["name"] = "John"; //实际上 operator[]() 重载返回的也是 Json::Value, 这里还重载了 operator=()root["age"] = 30;root["isStudent"] = true;root["email"] = Json::nullValue;//添加一个数组Json::Value hobbies(Json::arrayValue);hobbies.append("reading");hobbies.append("music");root["hobbies"] = hobbies;//添加一个嵌套的 JSON 对象Json::Value address;address["city"] = "New York";address["zipcode"] = "10001";root["address"] = address;//2.访问 JSON 对象std::cout << "2.访问 JSON 对象" << std::endl;//访问整个 JSON 对象std::cout << "JSON Object:" << root << std::endl;//访问 JSON 对象的值std::string name = root["name"].asString();int age = root["age"].asInt();bool isStudent = root["isStudent"].asBool();std::string email = root["email"].isNull() ? "null" : "no null";//访问数组元素std::cout << "hobby[]: ";for (const auto& hobby : root["hobbies"]) {std::cout << hobby.asString() << " ";}std::cout << std::endl;//访问内嵌 JSON 对象值std::string city = root["address"]["city"].asString();std::string zipcode = root["address"]["zipcode"].asString();//迭代 JSON 对象auto it = root.begin();auto key = it.key();auto value = (*it);std::cout << "类型: " << typeid(key).name() << " and " << typeid(value).name() << std::endl;for (auto it = root.begin(); it != root.end(); ++it){auto key = it.key();auto value = (*it);std::cout << key << "----" << value << std::endl;}std::cout << std::endl;//3.序列化操作std::cout << "3.序列化操作" << std::endl;std::cout << "低版本:" << std::endl;//空白字符经过压缩的序列化Json::FastWriter aFastWriter;std::string jsonString = aFastWriter.write(root);std::cout << jsonString << std::endl;//带有缩进和换行的序列化Json::StyledWriter aStyledWriter;std::string jsonStringStyle = aStyledWriter.write(root);std::cout << jsonStringStyle << std::endl;//高版本的序列化//class StreamWriter//{//    int write(Value const& root, std::ostream * sou); //sou 是输出型参数//};//但是由于虚继承关系, 必须按照下面方式进行调用//using namespace Json//Value val = ...;//StreamWriterBuilder builder;//builder['...'] = ...//std::unique_ptr<StreamWriter> writer(builder.newStreamWriter());//writer->write(value, &std::cout); //这会输出到流中std::cout << "高版本:" << std::endl;Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());std::stringstream ss;sw->write(root, &ss);std::cout << ss.str() << std::endl;//4.反序列化操作std::cout << "4.反序列化操作" << std::endl;std::cout << "低版本" << std::endl;Json::Value newRoot_1;Json::Value newRoot_2;Json::Reader aReader;bool parsingSuccessful;parsingSuccessful = aReader.parse(jsonString, newRoot_1);parsingSuccessful = aReader.parse(jsonStringStyle, newRoot_2);std::cout << newRoot_1 << std::endl;std::cout << newRoot_2 << std::endl;//高版本的反序列化//class CharReader//{//  bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs); //root 输出型参数//};//但是由于虚继承关系, 必须按照类似 StreamWriterBuilder 的方式来使用 CharReaderBuilderstd::cout << "高版本" << std::endl;Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());Json::Value getRoot;const char* s = jsonString.c_str();std::string err;bool res = cr->parse(s, s + strlen(s), &getRoot, &err);std::cout << getRoot << std::endl;return 0;
}

不过如果是我的话,我会选择使用较高版本的接口,总结起来就是以下的接口。

//常用高频接口
//制作 JSON 数据
Json::Value root; //创建 JSON 对象
root["key"] = value; //添加普通键值对或者嵌套 JSON 对象
Json::Value arr(Json::arrayValue); //添加数组对象
hobbies.append("arr[0]");
hobbies.append("arr[1]");
root["array"] = arr;//序列化操作
Json::StreamWriterBuilder swb;
swb["indentation"] = ""; //设置缩进为空字符串, 实现压缩(还有一些其他选项您可以查阅以下, 这里不再展开)
std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());std::stringstream ss;sw->write(root, &ss); //写入流
std::cout << ss.str() << std::endl;//反序列化操作
Json::CharReaderBuilder crb;
std::unique_ptr<Json::CharReader> cr(crb.newCharReader());Json::Value getRoot;
const char* s = jsonString.c_str();
std::string err;cr->parse(s, s + strlen(s), &getRoot, &err); //读取字符串
std::cout << getRoot << std::endl;

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

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

相关文章

如何判别三角形和求10 个整数中最大值?

分享每日小题&#xff0c;不断进步&#xff0c;今天的你也要加油哦&#xff01;接下来请看题------> 一、已知三条边a&#xff0c;b&#xff0c;c能否构成三角形&#xff0c;如果能构成三角形&#xff0c;判断三角形的类型&#xff08;等边三角形、等腰三角形或普通三角形 …

DAPP的商业模型创新: 探索可持续盈利路径

去中心化应用&#xff08;Decentralized Applications&#xff0c;DAPPs&#xff09;作为区块链技术的重要应用之一&#xff0c;在近年来蓬勃发展。然而&#xff0c;随着市场竞争的加剧和用户需求的不断变化&#xff0c;DAPP开发者们面临着寻找可持续盈利路径的挑战。本文将探讨…

注意libaudioProcess.so和libdevice.a是不一样的,一个是动态链接,一个是静态

libaudioProcess.so是动态链接&#xff0c;修改需要改根文件系统&#xff0c;需要bsp重新配置 libdevice.a是静态链接&#xff0c;直接替换就行 动态链接文件修改 然后执行fw_update.sh

VUE 插件收集

VsCode插件清单 中文插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 代码提示 Vue 2 Snippets Vetur插件让vue文件代码高亮 Vue VSCode Snippets自动生成vue模板内容插件 LiveServer实时刷新网页 Bracket Pair Colorizer彩虹括号 Material …

C++(17): C++:模板函数与模板类

1. 简述 泛型编程是一种编程风格&#xff0c;可以开发一套代码适应不同的数据类型。 C中&#xff0c;泛型编程是通过模板来实现的。模板是C支持参数化多态的工具&#xff0c;使用模板可以使用户为类属类型&#xff08;如数组的元素类型和容器的数据类型&#xff09;编写通用的…

什么是Spring MVC?它与Java Spring框架有什么关系?

Spring MVC是Spring框架中的一个模块&#xff0c;主要用于构建Web应用程序。它是一个基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View和Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清…

最优控制理论笔记 - 03无约束条件下的泛函极值问题

一、始端时刻t0和终端时刻tf时刻都给定的泛函极值问题 其中式子2.8为欧拉方程&#xff0c;式子2.9为横截条件。 上述推导的重要作用在于将求泛函的极值问题转化为求解欧拉方程在满足边界条件和横截条件下的定解问题。 1. 固定始端和终端 2. 自由始端和自由终端 3. 自由始端和…

一文读懂链游!探索链游的前世今生,区块链与游戏结合的新兴趋势

区块链技术的崛起给游戏行业带来了前所未有的变革&#xff0c;而链游&#xff08;Blockchain Games&#xff09;正是这一变革的产物。本文将带您一览链游的前世今生&#xff0c;探索区块链与游戏结合的新兴趋势。 1. 链游的起源 链游&#xff0c;顾名思义&#xff0c;是指利用…

代码随想录打卡—day29—【回溯】— 回溯基础练习 4.19+4.20

1 491. 非递减子序列 一开始的思路是根据上一篇的3 90. 子集 II&#xff0c;加上set开始魔改。 即不要nums[i]和相邻元素val相等且在同一层就continue&#xff0c;但是本题不能sort所以没有相邻元素val&#xff0c;所以我加了set设置为本层之前遍历过的元素。代码如下&#x…

恶心透了的小日子,害人终害己,国货呼吁关注抵制日本核废水排放

​|日本排放核废水 日本政府决定将福岛第一核电站的核污染水经过处理后排放入海&#xff0c;这一决定引发了多方面的担忧和反对&#xff0c;特别是在周边国家&#xff0c;包括中国和韩国。关于日本排放核污染水这一新闻事件&#xff0c;我们必须首先认识到&#xff0c;核能利用…

【MySQL 数据宝典】【磁盘结构】- 002 数据字典

一、数据字典 ( Data Dictionary ) 1.1 背景介绍 我们平时使用 INSERT 语句向表中插入的那些记录称之为用户数据&#xff0c;MySQL只是作为一个软件来为我们来保管这 些数据&#xff0c;提供方便的增删改查接口而已。但是每当我们向一个表中插入一条记录的时候&#xff0c;MyS…

C# 语言类型(二)—预定义类型之字符串及字符类型简述

总目录 C# 语法总目录 参考链接&#xff1a; C#语法系列:C# 语言类型(一)—预定义类型值之数值类型 C#语法系列:C# 语言类型(二)—预定义类型之字符串及字符类型简述 C#语法系列:C# 语言类型(三)—数组/枚举类型/结构体 C#语法系列:C# 语言类型(四)—传递参数及其修饰符 C#语法…

《SQLite系列》SQLite数据库常用命令大全

SQLite是一个轻量级的数据库系统&#xff0c;广泛应用于嵌入式系统和移动应用中。由于其简洁、快速和高效的特点&#xff0c;SQLite成为了许多开发者的首选数据库。本文将详细介绍SQLite数据库的常用命令&#xff0c;帮助读者更好地掌握和使用SQLite。 一、SQLite命令行工具 …

MySQL-知识点详解

本文简要介绍了MySQL数据库的关键内容&#xff0c;包括数据类型、SQL语句、索引类型以及数据库优化等方面。详细讨论了各种数据类型&#xff0c;比较了DATETIME和TIMESTAMP类型&#xff0c;解释了SQL语句的执行顺序和数据库连接方式&#xff0c;介绍了MySQL索引的概念和优缺点&…

RTT-线程通信:邮箱

RTT-线程通信&#xff1a;邮箱 裸机编程常用全局变量做通信,但在RTT上会有以下缺点&#xff1a; 多线程使用时&#xff0c;需要采用互斥措施 当项目全局变量需要很时候&#xff0c;代码的可读性和全局变量会很差 全局变量会导致分层不合理&#xff0c;与模块化相违背 项目大时&…

前端学习之DOM编程案例:点名案例和秒表案例

点名 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>点名案例</title><style>*{margin: 0;padding: 0;}</style> </head> <body><div id"container">…

H5 台球猜位置小游戏

刷到抖音有人这样玩&#xff0c;就写了一个这样的小游戏练习一下H5的知识点。 小游戏预览 w(&#xff9f;Д&#xff9f;)w 不开挂越急越完成不了&#xff0c;&#x1f47f;确认15次也没全对… 知识点 获取坐标位置的DOM元素&#xff0c;感觉应该是新的吧&#xff0c;以前的…

使用Python进行容器编排Docker Compose与Kubernetes的比较

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 随着容器化技术的普及&#xff0c;容器编排成为了管理和部署容器化应用程序的重要环节。在容…

[C++][算法基础]求约数(试除法)

给定 n 个正整数 &#xff0c;对于每个整数 &#xff0c;请你按照从小到大的顺序输出它的所有约数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数 。 输出格式 输出共 n 行&#xff0c;其中第 i 行输出第 i 个整数 的所有约数。 数据范围 1≤…

18 - Debian如何配置vsftpd(3)虚拟用户验证

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置vsftpd(3)虚拟用户验证 《傅老师Debian小知识库系列之18》——原创 ==前言== 傅老师Debian小知识库特点: 1、最小化拆解Debian实用技能; 2、所有操作在VM虚拟机实测完成; 3、致力…