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.mzph.cn/pingmian/13584.shtml

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

相关文章

《QT实用小工具·六十五》基于QPropertyAnimation实现的移动动画和控件覆盖

1、概述 源码放在文章末尾 该项目基于QPropertyAnimation实现了控件平移动画和控件之间的相互覆盖效果&#xff0c;项目demo演示如下所示&#xff1a; 项目解析&#xff1a; new QPropertyAnimation(ui.SingleOcclusion, “pos”); //创建动画对象&#xff0c;第一个参数传…

《Python编程从入门到实践》day37

# 昨日知识点回顾 制定规范、创建虚拟环境并激活&#xff0c;正在虚拟环境创建项目、数据库和应用程序 # 今日知识点学习 18.2.4 定义模型Entry # models.py from django.db import models# Create your models here. class Topic(models.Model):"""用户学习的…

时光初创知识付费模板 3.6.4 安装包 附教程

源码地址&#xff1a; https://wwv.lanzouh.com/b080wj8eh

码蹄集部分题目(2024OJ赛15期;前缀和+栈+堆+队列)

1&#x1f40b;&#x1f40b;&#x1f40b;门票&#xff08;钻石&#xff1b;前缀和&#xff09; 时间限制&#xff1a;1秒 占用内存&#xff1a;128M &#x1f41f;题目描述 &#x1f41f;输入输出格式 &#x1f41f;样例 &#x1f41a;样例 &#x1f41a;备注 &#x1f4…

docker和containerd的区别

docker和containerd的区别 1、容器运行时 1.1 容器运行时概念 容器运行时&#xff08;Container Runtime&#xff09;是一种负责在操作系统层面创建和管理容器的软件工具或组件。它是容器化技术的核心组件之一&#xff0c;用于在容器内部运行应用程序&#xff0c;并提供隔离…

ORACLE 资源管理参数与等待事件resmgr:cpu quantum

RESOURCE_MANAGER_PLAN 先来看下参数的含义 官网链接&#xff1a;RESOURCE_MANAGER_PLAN (oracle.com) 意思翻译过来这个参数用于资源计划。后边的看完也不是很明白具体的作用 于是参考了以下文章 Oracle 参数 RESOURCE_MANAGER_PLAN 官方解释&#xff0c;作用&#xff0c;…

Steam致富:玩免费游戏Banana获得可交易道具

最近&#xff0c;Steam平台上一款普普通通的免费游戏《Banana》引起了轰动&#xff0c;接近2万人同时在线&#xff0c;好评率高达94&#xff05;&#xff0c;究竟是什么让这款游戏如此受欢迎呢&#xff1f;原来&#xff0c;玩家们都在争相获取稀有的香蕉。 《Banana》属于点击放…

C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题

vector&#xff08;上&#xff09;&#xff1a;C初阶学习第八弹——探索STL奥秘&#xff08;三&#xff09;——深入刨析vector的使用-CSDN博客 vector&#xff08;中&#xff09;&#xff1a;C初阶学习第九弹——探索STL奥秘&#xff08;四&#xff09;——vector的深层挖掘和…

反序列化漏洞(JBoss、apache log4、apache Shiro、JWT)Weblogic未授权访问、代码执行、任意上传

1.1什么是反序列化 就是把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。假设&#xff0c;我们写了一个class&#xff0c;这个class里面存有一些变量。当这个class被实例化了之后&#xff0c;在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到…

CentOS-9配置静态IP地址

查看配置命令nmcli CentOS 9 使用 nmcli 命令行工具进行网络配置。以下是配置静态 IP 地址的步骤和示例代码&#xff1a;相对以前centos7之类的&#xff0c;9版本的默认的网络是NetworkManager&#xff0c;网络配置也有较大改变 nmcli con show用vim进行编辑配文件 cd /etc/…

JavaScript基础(九)

冒泡排序 用例子比较好理解: var arry[7,2,6,3,4,1,8]; //拿出第一位数7和后面依次比较&#xff0c;遇到大的8就换位&#xff0c;8再与后面依次比较&#xff0c;没有能和8换位的数&#xff0c;再从下一位2依次与下面的数比较。 console.log(排列之前&#xff1a;arry); for (…

开源大模型与闭源大模型:技术哲学的较量

目录 前言一、 开源大模型的优势1. 社区支持与合作1.1 全球协作网络1.2 快速迭代与创新1.3 共享最佳实践 2. 透明性与可信赖性2.1 审计与验证2.2 减少偏见与错误2.3 安全性提升 3. 低成本与易访问性3.1 降低研发成本3.2 易于定制化3.3 教育资源丰富 4. 促进标准化5. 推动技术进…

自养号测评是什么?亚马逊产品评价的全新策略

1、什么是亚马逊测评&#xff1a; 亚马逊测评&#xff0c;简而言之&#xff0c;是基于亚马逊购物平台的一种特定活动。他的核心在于模拟国外消费者的购物行为&#xff0c;并在完成购买后&#xff0c;对所获得的产品进行真实、中肯的评价。这种测评不仅为消费者提供了购物参考&…

微软开发者大会,Copilot Agents发布,掀起新一轮生产力革命!

把AI融入生产力工具的未来会是什么样&#xff1f;微软今天给出了蓝图。 今天凌晨&#xff0c;微软召开了Microsoft Build 2024 开发者大会&#xff0c;同前两天的Google I/O开发者大会一样&#xff0c;本次大会的核心词还是“AI”&#xff0c;其中最主要的内容是最新的Copilot…

成都爱尔胡建斌院长提醒近视超过600度,记得每年检查眼底!

高度近视是指近视度数在600度及以上的一种屈光不正的状态。 近视的眼睛必定是变形的。在正常情况下&#xff0c;人的眼球类似球体&#xff0c;但随着近视加深&#xff0c;眼轴变长&#xff0c;眼球体积逐渐增大&#xff0c;整个眼球从圆球型向椭圆球形发展&#xff0c;而眼球壁…

Linux:top命令的每一列的具体含义

Linux&#xff1a;top命令的每一列的具体含义 文章目录 Linux&#xff1a;top命令的每一列的具体含义图片显示top命令的概念语法显示字段的含义顶部字段第二行第三行第四行第五行每列字段的含义 图片显示 top命令的概念 top命令上一个常用的Linux命令行工具&#xff0c;用于实…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞&#xff0c;我刷题还是太少了&#xff0c;所以很多例子来自ctfshow&#xff0c;以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中&#xff0c;有两中判断相等的符号&#xff0c;和&…

位运算符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 位运算符是把数字看作二进制数来进行计算的&#xff0c;因此&#xff0c;需要先将要执行运算的数据转换为二进制&#xff0c;然后才能进行执行运算。…

[建堆堆排序的时间复杂度推导]向上建堆向下建堆堆排序的时间复杂度分析推导

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解数据结构系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭…

hypermesh二次开发tcl脚本

hypermesh二次开发tcl脚本 1、tcl读csv文件,得到list,再转成二维数组2、tcl写csv文件3、hypermesh tcl根据读入的节点坐标建节点, 再显示节点号4、hypermesh tcl根据节点号建节点set5、hypermesh tcl根据节点set读取节点号&#xff0c;再根据节点号读取节点坐标&#xff0c;再将…