C++第三方库【JSON】— jsoncpp

目录

认识JSON

jsoncpp库 安装&使用

认识jsoncpp

Json::Value

jsoncpp序列化

jsoncpp反序列化


认识JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,常用于在客户端和服务器之间传输数据。

JSON由键值对组成,键必须是字符串,而值可以是字符串,布尔值,数组,对象或null

以下是一个简单的额JSON实例

在C/C++中,学生信息存储如下:

//在C/C++中,小明的信息如下
const char* name = "小明";
int age = 18;
float score[3] = {84.5, 90.5, 87};

 使用JSON存储学生信息如下:

{"姓名" : "小明","年龄" : 18,"成绩" : [84.5, 90.5, 87]
}

json数据类型:对象,数组,字符串,数字,布尔值,null

对象:使用大括号{ }括起来

数组:使用中括号[ ]括起来

字符串:使用双引号" "括起来

数字:包括整型和浮点型,直接使用,都视为数组

键和值之间使用冒号:分隔,不同键值对之间使用逗号,分隔。数组也可以存储对象,如下:

[{"姓名" : "小明","年龄" : 18,"成绩" : [84.5, 90.5, 87]},{"姓名" : "小黑","年龄" : 17,"成绩" : [88.5, 93, 85]}
]

jsoncpp库 安装&使用

Linux下安装需执行如下指令

sudo yum install epel-release
udo yum install jsoncpp-devel//如果成功查询到json的头文件和动静态库即为安装成功
//查看json中的头文件
[ljh@VM-12-11-centos practice]$ ls /usr/include/jsoncpp/json
assertions.h  autolink.h  config.h  features.h  forwards.h  json.h  reader.h  value.h  version.h  writer.h//查看json的第三方库
[ljh@VM-12-11-centos practice]$ ls /usr/lib64/libjson*
/usr/lib64/libjsoncpp.so    /usr/lib64/libjsoncpp.so.0.10.5  /usr/lib64/libjson-c.so.2.0.1  /usr/lib64/libjson.so.0.1.0
/usr/lib64/libjsoncpp.so.0  /usr/lib64/libjson-c.so.2        /usr/lib64/libjson.so.0

使用时,包含头文件需要指明路径,gcc/g++默认查询的路径是/usr/include,而json.h的路径为/usr/include/jsoncpp/json/json.h。需包含头文件是#include <jsoncpp/json/json.h>

编译时需要链接jsoncpp库,需要加上-ljoncpp,如:

g++ -o test test.cc -std=c++11 -ljsoncpp

认识jsoncpp

jsoncpp是用于C++的JSON解析库,提供了简单易用的API来解析和生成JSON数据

最常用的是json格式的序列化和反序列化,完成将多个数据对象组织层json格式字符串,以及将json格式字符串解析得到多个数据对象的功能

Json::Value

Json::Value是JSON数据的通用类型。可以表示JSON对象,数组,字符串,数字,布尔值和null等各种类型

//Json数据对象类
class Json::Value{//Value重载了[]和=,因此所有的赋值和获取数据都可以通过Value &operator=(const Value &other); Value& operator[](const std::string& key);//示例:val["姓名"] = "小明";Value& operator[](const char* key);//移除元素Value removeMember(const char* key);//访问数组元素const Value& operator[](ArrayIndex index) const; //示例:val["成绩"][0]//添加数组元素Value& append(const Value& value);//示例:val["成绩"].append(88); //获取数组元素个数ArrayIndex size() const;//示例:val["成绩"].size();//访问数据,以string类型返回std::string asString() const;//示例:string name = val["name"].asString();//访问数据,以const char*类型返回const char* asCString() const;//示例:char *name = val["name"].asCString();//访问数据,以int类型返回Int asInt() const;//示例:int age = val["age"].asInt();//访问数据,以float类型返回float asFloat() const;//访问数据,以bool类型返回bool asBool() const;
};

jsoncpp序列化

序列化是将Json::Value转换成json格式的字符串

//json序列化类,低版本用这个更简单
class JSON_API Writer {virtual std::string write(const Value& root) = 0;
}
class JSON_API FastWriter : public Writer {virtual std::string write(const Value& root);
}
class JSON_API StyledWriter : public Writer {virtual std::string write(const Value& root);
}//json序列化类,高版本推荐,如果用低版本的接口可能会有警告
class JSON_API StreamWriter {virtual int write(Value const& root, std::ostream* sout) = 0;
}
class JSON_API StreamWriterBuilder : public StreamWriter::Factory {virtual StreamWriter* newStreamWriter() const;
}

建议使用高版本。

  • StreamWriter类的write接口可以将Json::Value对象转换为Json格式的字符串,借由sout输出流传出
  • 由于StreamWriter是抽象类,不能直接定义对象,需要先定义StreamWriterBuilder对象,再通过newStreamWriter接口获取StreamWriter对象,再使用writer接口

示例

  1. 将所有数据保存在Json::Value对象中
  2. 使用StreamWriter的write接口,完成序列化
  3. 通过sout输出流获取json格式字符串
#include <iostream>
#include <memory>
#include <sstream>
#include <jsoncpp/json/json.h>//测试序列化
void serialization()
{const char* name = "张三";int age = 26;float score[] = {84, 77.5, 88.3};//将所有数据保存到Json::Value中Json::Value root;root["姓名"] = name;root["年龄"] = age;//数组要使用appendroot["成绩"].append(score[0]);root["成绩"].append(score[1]);root["成绩"].append(score[2]);//序列化std::stringstream ss;Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());sw->write(root, &ss);//通过输出流获取json格式字符串std::cout << ss.str() << std::endl;
}int main()
{serialization();return 0;
}

通过打印显示json格式字符串

jsoncpp反序列化

反序列化是将json格式字符串转化成Json::Value对象,其中存储了各项数据

//json反序列化类,低版本用起来更简单
class JSON_API Reader {bool parse(const std::string& document, Value& root, bool collectComments = true);
}
//json反序列化类,高版本更推荐
class JSON_API CharReader {virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs) = 0;
}
class JSON_API CharReaderBuilder : public CharReader::Factory {virtual CharReader* newCharReader() const;
}

建议使用高版本。

  • CharReader中的parse实现反序列化逻辑:beginDoc和endDoc是需要转化的json格式字符串的起始地址和结束地址;root是输出型参数;如果反序列化出错,会返回false,并将错误信息存放在errs中
  • 同样,CharReader是抽象类,不能直接定义对象,借由CharReaderBuilder获取CharReader对象

示例

  1. 准备json格式字符串
  2. 获取CharReader对象,使用parse反序列化
  3. 通过转化类型接口打印Json::Value
#include <iostream>
#include <memory>
#include <sstream>
#include <jsoncpp/json/json.h>//反序列化
void deserialization()
{//C++11新特性 R//R后的字符串,其中()括起来的任何字符都表示其本意,省略转义字符,如\就是字符\std::string str = R"({"姓名":"张三", "年龄":22, "成绩":[88, 78.4, 92.7]})";//Json字符串Json::Value root;//Json的ValueJson::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;//错误信息bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);if(ret == false){std::cout << "Json CharReader 解析错误\n";exit(-1);}//打印Value信息std::cout << "姓名: " << root["姓名"].asString() << std::endl; std::cout << "姓名: " << root["年龄"].asInt() << std::endl; size_t len = root["成绩"].size();std::cout << "成绩: ";for(int i = 0; i < len; ++i)std::cout << root["成绩"][i] << " "; std::cout << std::endl;
}int main()
{deserialization();return 0;
}

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

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

相关文章

钉钉网页应用使用JSAPI报错,dd.alert提示errorCode:3.errorMessage:No value for message

问题分析&#xff1a; 起因是我用下图这个页面&#xff08;配置JSAPI鉴权&#xff09;的链接下载了JSAPI&#xff08;客户端API&#xff09;的SDK&#xff0c;但其实如图所示这个版本是2.10.3&#xff1a; 通过查看dingtalk-jsapi的npm版本&#xff0c;可以知道钉钉的JSAPI已…

c++设计模式-->访问者模式

#include <iostream> #include <string> #include <memory> using namespace std;class AbstractMember; // 前向声明// 行为基类 class AbstractAction { public:virtual void maleDoing(AbstractMember* member) 0;virtual void femaleDoing(AbstractMemb…

荣耀MagicBook X 14 Pro锐龙版 2023 集显(FRI-H76)笔记本电脑原装出厂Windows11系统工厂模式安装包下载,带F10智能还原

恢复开箱状态预装OEM系统&#xff0c;适用型号&#xff1a;HONOR荣耀FRI-H76、FRI-H56 链接&#xff1a;https://pan.baidu.com/s/1Lcg45byotu5kDDSBs3FStA?pwdl30r 提取码&#xff1a;l30r 华为荣耀原装WIN11系统工厂安装包&#xff0c;含F10一键恢复功能、系统自带所有驱…

H800基础能力测试

H800基础能力测试 参考链接A100、A800、H100、H800差异H100详细规格H100 TensorCore FP16 理论算力计算公式锁频安装依赖pytorch FP16算力测试cublas FP16算力测试运行cuda-samples 本文记录了H800基础测试步骤及测试结果 参考链接 NVIDIA H100 Tensor Core GPU Architecture…

快速搭建SpringMvc项目

一、什么是springMvc 1、介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08; spring-webmvc &#xff09;&#xff0c;但它通常被称为“Spring MVC”。 在控制…

NFT开发框架和工具

NFT&#xff08;非同质化代币&#xff09;开发涉及多个框架和工具&#xff0c;帮助开发者创建、管理和交易NFT。以下是一些常用的NFT开发框架和工具&#xff0c;这些框架和工具覆盖了NFT开发的各个方面&#xff0c;从智能合约编写到前端集成&#xff0c;再到区块链平台和市场&a…

syncthing文件夹同步与版本管理

1 前言 syncthing可以用来同步文件夹里的所有文件&#xff0c;并且有不错的版本管理&#xff0c;基本每次更改文件&#xff0c;20-40秒就被扫描到了&#xff0c;非常丝滑&#xff1b;这次以此来同步obsidian的插件和文件&#xff0c;达到多端同步&#xff1b; 我家里有一台台…

ubuntu设置root开机登录,允许root用户ssh远程登录

ubuntu与centos系统不同&#xff0c;默认root开机不能登录。 1、输入一下命令创建root密码&#xff0c;根据提示输入新密码 sudo passwd root 2、打开gdm-autologin文件&#xff0c;将auth required pam_succeed_if.so user ! root quiet_success这行注释掉&#xff0c;这行就…

leetCode-hot100-数组专题之区间问题

数组专题之区间问题 知识点&#xff1a;解决思路&#xff1a;例题56.合并区间57.插入区间253.会议室 Ⅱ485.无重叠区间 数组区间问题是算法中常见的一类问题&#xff0c;它们通常涉及对数组中的区间进行排序、合并、插入或删除操作。无论是合并区间、插入区间还是删除重复空间&…

使用ScriptGraphicHelper综合图色助手进行找色

使用ScriptGraphicHelper综合图色助手进行找色&#xff0c;然后使用autojs进行点击具体位置。 打开ScriptGraphicHelper软件&#xff0c;载入截图后如上图&#xff0c;比如要点击微信 按住鼠标左键&#xff0c;拖动&#xff0c;选择上图箭头位置,然后点击裁图 可以点击容差范围…

微服务如何做好监控

大家好&#xff0c;我是苍何。 在脉脉上看到这条帖子&#xff0c;说阿里 P8 因为上面 P9 斗争失败走人&#xff0c;以超龄 35 被裁&#xff0c;Boss 上找工作半年&#xff0c;到现在还处于失业中。 看了下沟通记录&#xff0c; 沟通了 1000 多次&#xff0c;但没有一个邀请投递…

基于深度学习的表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着人工智能技术的快速发展&#xff0c;表情识别成为了人机交互领域的一个研究热点。表情识别技术旨…

【四、性能测试】Linux stress 压力模拟测试工具

在做 CPU 问题解析之前&#xff0c;需要先了解一下压力模拟工具&#xff0c;可以将 CPU、MEM、IO 等进行压力模拟&#xff0c;可以在模拟压力的过程中进行问题解析 一、STRESS 模拟对CPU、Memory、IO、磁盘进行压力测试。可以使用 stress 工具&#xff0c;它是专门针对 linux…

如何将Docker容器打包并在其他服务器上运行

如何将Docker容器打包并在其他服务器上运行 我会幻想很多次我们的相遇&#xff0c;你穿着合身的T恤&#xff0c;一个素色的外套&#xff0c;搭配一条蓝色的牛仔裤&#xff0c;干净的像那天空中的云朵&#xff0c;而我&#xff0c;还是一个的傻傻的少年&#xff0c;我们相识而笑…

【无标题】(网络原理(中)TCP机制)

网络原理&#xff08;中&#xff09;TCP机制 拥塞控制延迟应答&#xff08;效率机制&#xff09;TCP协议段格式&#xff1a;滑动窗口&#xff08;效率机制&#xff09;流量控制 拥塞控制 TCP拥塞控制这样的过程&#xff0c;就好像 热恋的感觉&#xff0c;指数增长的过程就是热恋…

2024-5-23 石群电路-14

2024-5-23&#xff0c;星期四&#xff0c;22:20&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天没有什么重要的事情发生&#xff0c;心情一如既往的平静&#xff0c;距离返校假期还有两天~~~。 今天观看了石群老师电路基础课程的第23/24个视频&#xff0…

适用于Windows 电脑的最佳视频恢复软件和方法

毫无疑问&#xff0c;丢失您的基本数据总是有压力的&#xff0c;尤其是当这些是您为捕捉最美好回忆而收集的重要视频文件时。要恢复丢失或损坏的视频文件&#xff0c;您可以借助视频恢复工具。但是&#xff0c;在选择最佳视频恢复工具时&#xff0c;您必须考虑多个扫描选项&…

AWS容器之Amazon ECS

Amazon Elastic Container Service&#xff08;Amazon ECS&#xff09;是亚马逊提供的一种完全托管的容器编排服务&#xff0c;用于在云中运行、扩展和管理Docker容器化的应用程序。可以理解为Docker在云中对应的服务就是ECS。

【运维心得】双WAN配置的一个误区

目录 双WAN配置及优势 实际案例 解决之道 最后总结 双WAN配置及优势 什么是双WAN配置&#xff0c;这里就不多赘述&#xff0c;简单的说&#xff0c;首先你要有一台支持双WAN口的路由器&#xff0c;目前大多数企业级路由器都具备了这个功能。甚至有些家用路由器也有此类功能…

Vue02-黑马程序员学习笔记

一、今日学习目标 1.指令补充 指令修饰符v-bind对样式增强的操作v-model应用于其他表单元素 2.computed计算属性 基础语法计算属性vs方法计算属性的完整写法成绩案例 3.watch侦听器 基础写法完整写法 4.综合案例 &#xff08;演示&#xff09; 渲染 / 删除 / 修改数量 …