json 库的下载与使用

news2024/11/14 19:49:31

Json

  • 简介
  • Json下载
  • Json::Value 数据对象类
  • Json 序列化/反序列化的介绍
    • Json 的序列化类
      • 低版本
      • 高版本
    • Json 的反序列化类
      • 低版本
      • 高版本
  • Json序列化操作
  • Json反序列化操作

简介

json 是一种数据交换格式,采用独立于编程语言的文本格式来存储和表示的数据。

Json下载

使用 Json 需要先下载对应的 Json库,下载步骤如下:

  1. 先更新 yum 源的缓存:
yum makecache fast
  1. 下载 json 库
sudo yum -y install jsoncpp-devel

在下载好 json 库后,使用这个库时需要包含头文件:#include <jsoncpp/json/json.h>

由于 json库是第三方库,在 g++ 编译阶段是需要告诉编译器编译时要找对应的 json库,对此编译时需要带上 -ljsoncpp选项:

g++ -o test test.cc -std=c++11 -ljsoncpp #test.cc举例文件

Json::Value 数据对象类

Value 是 json 提供的一个数据类型,通过这个数据类型定义的对象,我们可以调用其中对应的成员函数。

下面是Value数据对象类的成员函数:

class Json::Value
{
	Value &operator=(const Value &other);  //表示任意的数据都可以进行赋值
	Value& operator[](const std::string& key);//使用字符串进行赋值 va["姓名"]=“小明";
	Value& operator[](const char* key);
	
	Value removeMember(const char* key);//删除数据
	const Value& operator[](ArrayIndex index) const; //val["成绩"][0]
	
	Value& append(const Value& value);//添加数组元素, va1["成绩"].append(88);
	ArrayIndex size()const;//获取数组元素个数, va["成绩"].size()
	
	//转对应的数据类型
	std::string asstring( const;//转string类型, string name =val["name"l.asstring();
	const char* ascstring();//转char*类型
	Int asIntO const;//转int类型
	float asFloat() const;//转float类型
	bool asBool()const;//转 bool 类型
};

Json 序列化/反序列化的介绍

  • 序列化是指将编程语言中的数据(如对象、数组等)转换成 Json 格式的字符串
  • 反序列化是序列化的逆过程,将序列化的 Json 字符串恢复为原来的数据

Json 的序列化类

Json 序列化类有两个版本,分别是 高版本的 Json 序列化类 和 低版本的 Json 序列化的类。

两个版本的区别就是:低版本使用起来比较容易上手,但是由于版本的原因,使用低版本会出现警告的提示使用高版本就不会

低版本

其中,低版本的 Json序列化中提供了两个序列化的接口,分别是:Fastwriter styledwriter

//父类
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); //root表示Json数据对象
}

class JSoN_API styledwriter :public writer 
{
	virtual std::string write(const Value& root);//root表示Json数据对象
}

Fastwriter styledwriter 类都继承了Writer类,都对父类的 write 虚函数函数进行了重写,构成了多态。这两个类都是将 Json::Value 数据对象转换为字符串。

两者之间的不同的区别就是:在调用 StyleWriter 类将数据对象转换为字符串时会增加缩进和换行符,使生成的JSON字符串具有良好的可读性,方便调试;而 Fastwriter 是将数据对象转换为字符串就结束了

高版本

在高版本的 Json序列化中只有一个类:StreamwriterBuilder

//父类
class JSON_API streamWriter 
{
	virtual int write(Value const& root, std::ostream* sout)= 0;//root表示Json数据对象,sout表示将数据显示到输出
}

//子类
class JSON_API StreamwriterBuilder : public streamwriter::Factory 
{	
	virtual streamwriter* newstreamWriter() const;
}

高版本使用起来有点麻烦,在定义序列化对象时,需要用指针的方式来接收 StreamwriterBuilder 类对象调用 newstreamWriter成员函数来返回的streamWriter * 的指针类型的对象。

序列化定义对象示例:

void test()
{
	StreamwriterBuilder builder; //定义StreamwriterBuilder对象
	std::unique_ptr<Json::streamWriter> writer(builder.newstreamWriter()); //定义序列化对象writer
}

通过高版本来定义序列化对象可以很好避免了版本问题,不会出现告警的提示。

Json 的反序列化类

与 Json 序列化类一样,Json 反序列化类也有高低版本之分。低版本使用起来很简便容易,但是有告警出现;高版本使用比较麻烦,但是解决了告警出现。

低版本

class JSON_API Reader 
{
	bool parse(const std::string& document, Value& root, bool collectcomments = true);
}

参数介绍:

  1. document:表示要转换的Json格式的字符串
  2. root:将转换的内容存入到数据对象中
  3. 返回值:转换成功返回 true,失败返回 false

collectcomments 参数一般不需要设置,默认缺省即可。

高版本

//父类
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;
}

使用方式如同序列化高版本那般,需要先定义 CharReaderBuilder 对象,通过这个对象去构建 charReader 对象指针,进而去使用 parse 方法。

parse 参数介绍:

  1. beginDoc:指向需要转换的Json格式的字符串起始位置
  2. endDoc:指向需要转换的Json格式的字符串末尾位置
  3. root:将转换的内容存入到数据对象中
  4. errs:表示转换失败会将失败信息打印到标准错误中
  5. 返回值:转换成功返回 true,失败返回 false

Json序列化操作

来看这样的一个类:

class Request
{
public:
	Request(){}
    Request(int x, int y, char op): _x(x), _y(y), _op(op)
      {}
	~Request() {}
public:  
	int _x;
	int _y;
	char _op;
};

通过上面提供的类,将对应的成员变量进行序列化操作:

  1. 先定义 Value 数据对象
Json::Value root;  //root对象通过重载[]的方式,可以用来接收任意的 key/val 类型
  1. 调用 root 对象的成员函数,进行 key/val 赋值
  2. 定义序列化对象:FastWrite
  3. 调用FastWrite定义对象的成员函数:write 完成序列化操作

具体的操作如下示例:

class Request
{
public:
	//其他成员函数...
	//序列化
	bool Serialize(std::string *outStr)
	{
		Json::Value root;
		//接收key/val类型
		root["x"] = _x;
        root["y"] = _y;
        root["op"] = _op;
		
		Json::FastWrite writer; //writer用来序列化的对象
		std::string outStr = writer.write(root); //将结构化数据转换为json字符串
		
		return true;
	}
public:  
	int _x;
	int _y;
	char _op;
};

下面是用 Json 高版本的序列化类举的例子:

#include <iostream>
#include <memory>
#include <sstream>
#include <string>
#include <jsoncpp/json/json.h>

int main()
{
    const char *name = "张三";
    int age = 18;
    float score[] = {77, 88.8, 99.5};

    Json::Value root;
    root["姓名"] = name;
    root["年龄"] = age;
    root["成绩"].append(score[0]);
    root["成绩"].append(score[1]);
    root["成绩"].append(score[2]);

    //序列化操作
    Json::StreamWriterBuilder swb;
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
    std::stringstream ss;
    sw->write(root, &ss);

    //输出内容
    std::cout << ss.str() << std::endl;

    return 0;
}

在这里插入图片描述

Json反序列化操作

与序列化操作类似:

  1. 先定义 Value 数据对象
Json::Value root;  //root对象通过重载[]的方式,可以用来接收任意的 key/val 类型
  1. 定义反序列化对象:Reader
  2. 调用Reader定义对象的成员函数:parse 完成反序列化操作
Json::Reader reader;
reader.parse(str, root);//str是json串,parse函数是将json串转化为结构化数据
  1. 最后对原来的结构化数据进行赋值,完成反序列化的工作

具体的操作如下示例:

class Request
{
public:

	//其他成员函数...
	
	//反序列化
	bool Deserialize(const std::string &isStr) //isStr是json串
	{
		Json::Value root;
		Json::Reader reader;//reader用来反序列化的对象
		
		reader.parse(isStr, root);//将json串转化为结构化数据
		
		//进行结构化数据的赋值操作
	 	_x = root["x"].asInt();
        _y = root["y"].asInt();
        _op = root["op"].asInt();

		return true;
	}
public:  
	int _x;
	int _y;
	char _op;
};

下面是用 Json 高版本的反序列化类举的例子:

int main()
{
    std::string str = R"({"姓名":"张三", "年龄":20, "成绩":[59, 66.5, 77.5]})"; // 使用R"()"可以防止字符串内部符号出现歧义
    Json::Value root;

    // 反序列化操作
    Json::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 << "parse error : " << err << std::endl;
        exit(-1);
    }
    //解析成功,输出内容
    std::cout << "姓名:" << root["姓名"].asString() << std::endl;
    std::cout << "年龄:" << root["年龄"].asInt() << std::endl;

    int sz = root["成绩"].size();
    std::cout << "成绩:";
    for(int i = 0; i < sz; i++)
    {
        std::cout << root["成绩"][i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这里插入图片描述
Json 下载与简单使用就介绍到这里,喜欢的老铁可以点个赞加关注。

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

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

相关文章

波导阵列天线单元 学习笔记3 基于空气填充双模馈网的双圆极化膜片天线阵列

摘要&#xff1a; 此通信提出了一种使用空气填充双模馈网的基于膜片极化器的双圆极化天线阵列。一种1分4的圆腔单层覆盖在膜片极化器上来抑制栅瓣。全公司馈网被一个双模传输线所实现&#xff0c;以此在一组馈网内联合了TEM模式&#xff08;由HW悬架线激励&#xff09;和TE10模…

Stable Diffusion赋能“黑神话”——助力悟空走进AI奇幻世界

《黑神话&#xff1a;悟空》是由游戏科学公司制作的以中国神话为背景的动作角色扮演游戏&#xff0c;将于2024年8月20日发售。玩家将扮演一位“天命人”&#xff0c;为了探寻昔日传说的真相&#xff0c;踏上一条充满危险与惊奇的西游之路。 同时&#xff0c;我们还可以借助AI绘…

智能电子班牌源码之终端管理-SAAS本地化及未来之窗行业应用跨平台架构

一智能电子班牌 智能电子班牌为教育行业量身打造&#xff0c;高清显示屏体、可安装各类软件&#xff0c;满足门禁、考勤、信息显示等多种功能。节能防水防误触设计&#xff0c;更适用于校园环境。 二、设备管理 1. 提高效率&#xff1a;管理员无需亲临设备现场&#xff0c;…

Maven-03.idea集成-配置及创建maven项目

一.配置Maven 写在前面&#xff1a;特别注意idea版本与Maven版本以及jdk版本与Maven版本的匹配问题。一定要下载和当前idea版本以及jdk版本匹配的maven版本&#xff0c;否则会出问题。具体匹配结果上网查询&#xff01;此处采用idea2023.2.3&#xff0c;jdk17&#xff0c;mave…

edge浏览器可以,chrome浏览器看不到接口数据

chrome 谷歌浏览器&#xff0c;可以看到页面&#xff0c;F12的开发者工具看不到返回数据 无法加载响应数据: No data found for resource with given identifier Chrome 将显示 ERR_INTERNET_DISCONNECTED 错误 edge浏览器是正常的。 哈哈哈哈哈哈&#xff0c;这里误点了&a…

C ++初阶:类和对象(上)

目录 &#x1f31e;0.前言 1. 面向过程和面向对象初步认识 2..类的引入与定义 2.1类的引入 2.2类的定义 3.类的访问限定符及其封装 3.1访问限定符 3.2封装 4.类的作用域 4.1加餐和发现 5.类的实例化 6.类对象大小的计算 6.1.内部的存储方式 6.2结构体对齐规则回顾…

【闪送-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【办公软件】安全风险 Microsoft 已阻止宏运行,因为此文件的来源不受信任

Excel 2019版本&#xff0c;就出现安全风险 Microsoft 已阻止宏运行 因为此文件的来源不受信任的问题&#xff0c;宏直接就用不了了。 网上的解决方法&#xff0c;文件右键属性->取消安全锁。但存在没有安全锁这个选项。后查询到一个简单的解决方法。 打开Excel表格->文件…

利用MongoDB进行数据治理,防范构建生成式AI应用程序时的潜在安全风险

生成式人工智能&#xff08;生成式AI&#xff09;正在蓬勃发展&#xff0c;许多企业和初创公司正在运用AI工具来解决各自的用例问题。随着企业逐渐适应市场上的新技术范式转移&#xff0c;开发者社区和开源模型也在不断发展壮大。 构建智能生成式AI应用程序需要灵活运用数据。…

R语言统计分析——线性模型假设的综合验证与多重共线性

参考资料&#xff1a;R语言实战【第2版】 1、线性模型假设的综合验证 gvlma包中的gvlma()函数&#xff0c;能对线性模型进行综合验真&#xff0c;同时还能做偏斜度、峰度和异方差性的评价。也就是说&#xff0c;它给模型提供了一个单独的综合验证&#xff08;通过/不通过&…

RK3568平台开发系列讲解(UART篇)line discipline

🚀返回专栏总目录 文章目录 一、UART 读写过程二、line discipline组成沉淀、分享、成长,让自己和他人都能有所收获!😄 line discipline 介于 TTY 层和具体的串口驱动 ( 比如 serial8250 ) 之间。 一、UART 读写过程 发送数据时: 应用程序通过系统调用向 TTY 设备文件写…

打卡学习Python爬虫第四天|bs4爬取优美图库的小清新图片

bs4解析比较简单&#xff0c;通过HTML的标签和属性去提取值&#xff0c;find(标签,属性"值"&#xff09; 但是需要了解HTML的语法知识&#xff0c;然后再使用bs4去提取&#xff0c;逻辑和编写难度就会比较简单和清晰。 bs4如何使用&#xff1f;如有如下HTML代码&am…

币价与数据持续低迷,比特币和以太坊能否从低谷中恢复?

在过去的一周里&#xff0c;加密货币市场经历了令人失望的表现&#xff0c;比特币和以太坊的价格持续低迷&#xff0c;引发了投资者的广泛关注。尽管宏观经济背景提供了一些利好因素&#xff0c;但市场情绪依然低迷&#xff0c;BTC/USD 和 ETH/USD 均未能打破当前的下行趋势。本…

鸿蒙HarmonyOS开发知识:命令行工具篇—“codelinter”

codelinter同时支持使用命令行执行代码检查与修复&#xff0c;可将codelinter工具集成到门禁或持续集成环境中。 codelinter命令行格式为&#xff1a; codelinter [options] [dir] options&#xff1a;可选配置&#xff0c;请参考表1。 dir&#xff1a;待检查的工程根目录…

在项目中运用os 模块获取本机ip地址并运用到终端启动成功打开network

一、安装os模块 os 模块是 Node.js 的内置模块&#xff0c;不需要额外安装 二、在项目中新建一个名为 getLocalIpAddress.js 的文件 // getLocalIpAddress.js const os require(os);function getLocalIpAddress() {const interfaces os.networkInterfaces();for (const na…

LNMP 架构(Linux+NGINX+memcache+PHP)

目录 1 源码编译PHP与NGINX 1.1 NGINX 源码编译 1.2 PHP 源码编译安装 2 实现PHP与NGINX的连接 2.1 php-fpm的详细介绍 2.2 LNMP与LAMP的区别 2.3 PHP配置文件的介绍 2.4 实例实现php-fpm 与 NGINX的连接 2.4.1 指定pid的存放位置 2.4.2 php-fpm设置监听自己端口与IP 2.4.3 主配…

Excel 跨表格引用单格公式--> =表格名!单元格坐标

背景 需要将 A 表格中某单个单元格引用到 B 表格。一搜教程都是 VLOOKUP 函数&#xff0c;但是该函数用于多内容条件应用&#xff0c;尝试中发现公式&#xff0c;遂总结成经验贴。 公式&#xff08;注意符号英文&#xff09;&#xff1a; 表格名!单元格坐标 例子 这里需要…

【游戏】什么是摄影游戏(Photography Games)

“Photography games” 是指以摄影为主题或核心机制的电子游戏。这类游戏通常让玩家通过虚拟摄像头或相机捕捉游戏世界中的场景、人物、动物或物品。这些游戏可以有不同的玩法和目标&#xff0c;通常包括以下几种类型&#xff1a; 探索与拍摄&#xff1a;玩家在游戏世界中自由…

【大模型理论篇】LLaMA3结构关键模块分析

1. 背景介绍 在文章《关于LLaMA 3.1 405B以及小模型的崛起》中&#xff0c;我们提到&#xff0c;LLaMA 3.1 的模型架构基本上已经成为当前LLM 模型的标准结构&#xff0c;和《Transformer原理分析》中提到的结构&#xff0c;也类似。但相比较&#xff0c;其中的一些关键模…

day38——动态库与静态库

一、linux系统中的库 库在linux系统中是一个二进制文件&#xff0c;它是由XXX.c&#xff08;不包含main函数&#xff09;文件编译而来的&#xff0c;分为静态库和动态库。 库在系统中的内容是不可见的&#xff0c;是一个二进制乱码 当程序需要使用库中的相关函数时&#xff…