json-cpp的下载与使用

devtools/2024/10/11 13:27:14/

jsoncpp__0">1.json-cpp 的概要

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

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

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

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

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

jsoncpp__17">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.ppmy.cn/devtools/9532.html

相关文章

java在线问卷调查系统的设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线问卷调查系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于java的在线问卷调查…

Web前端-Vue

黑马程序员JavaWeb开发教程 文章目录 一、什么是Vue1、Vue概念2、Vue快速入门&#xff08;1&#xff09;快速入门&#xff08;2&#xff09;插值表达式 三、Vue常用指令1、常用指令2、指令使用详解&#xff08;1&#xff09;v-bind&#xff08;2&#xff09;v-model&#xff08…

RAFT: Adapting Language Model to Domain Specific RAG

背景 大型语言模型(LLMs)在大量文本数据集上进行预训练已成为标准做法 LLMs用于许多下游应用时,通常会通过基于RAG的提示或微调,将新知识(例如时效性新闻或私有领域知识)融入预训练模型中 模型获取新知识的最优化方法仍然是一个开放性问题 专业知识痛点 大型语言模型(LL…

大模型改变了NLP的游戏规则了吗

NLP已经死了吗&#xff1f; 自从 ChatGPT 横空出世以来&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09; 研究领域就出现了一种消极的声音&#xff0c;认为大模型技术导致 NLP “死了”。在某乎上就有一条热门问答&#xff0c;大…

江苏瑞达环保科技股份有限公司| 邀您参加2024全国水科技大会暨技术装备成果展览会

—— 展位号:A18 —— 江苏瑞达环保科技股份有限公司是一家致力于环境保护和可持续发展的高新技术企业&#xff0c;专注于环境治理技术研发和环保节能装备制造,为工业企业提供可靠的工程解决方案。2023年&#xff0c;瑞达科技被认定为江苏省省级专精特新企业。 瑞达科技成立于2…

Web 常见十大漏洞原理及利用方式

一、PHP命令执行函数 原理: 命令执行函数解释:在PHP中有一些执行命令的函数&#xff0c;这些函数使你可以在PHP基本执行外部执行命令&#xff0c;并获取其输出的结果 漏洞产生原因&#xff1a; &#xff08;1&#xff09;没有对用户输入进行过滤或过滤不严 例如&#xff0c;…

算法—hash使用

熟悉hash映射&#xff0c;用key判断是否对象存在或者存在个数&#xff0c;在其他问题种常用来记录key&#xff08;键值&#xff09;是否存在&#xff08;或者存在个数&#xff09;&#xff0c;用来if判断。1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution…

轻松上手MYSQL:MYSQL初识(下)

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《MYSQL入门》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 轻松上手MYSQL&#xff1a;从零开始构建你的数据库世界 &#x1f680; &#x1f680;欢迎来到My…