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做的一个井子棋游戏——浔川python社

简介&#xff1a; 在井子棋的基础上&#xff0c;我们改进了登录界面。允许大量玩家注册! # -*- coding: utf-8 -*- import tkinter as tk import tkinter.messagebox import pickle import random# 窗口 window tk.Tk() window.title(欢迎进入python) window.geometry(450x2…

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

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

TypeScript中的类型推断(Type Inference):自动化的类型安全

TypeScript中的类型推断&#xff08;Type Inference&#xff09;&#xff1a;自动化的类型安全 引言 类型推断是TypeScript的一个关键特性&#xff0c;它允许编译器根据值的初始化或上下文自动推导出变量的类型。这减少了需要显式指定的类型注解&#xff0c;同时保持了代码的…

springboot中不同请求方式的注解有哪些,有什么含义

在Spring Boot中&#xff0c;处理Web请求通常使用Spring MVC框架&#xff0c;它提供了一系列的注解来支持不同的HTTP请求方式。以下是一些常用的注解及其含义&#xff1a; RequestMapping: 这是一个通用的映射注解&#xff0c;可以用于映射类或方法到HTTP请求。它支持多种请求方…

Python进阶之深入类和对象

鸭子类型 鸭子类型实际上类似于多态的概念。指的是我们在使用一个父类的时候&#xff0c;不关心子类具体是什么&#xff0c;只要之类实现了父类必须要要实现的方法&#xff0c;我们就把它当成父类使用。 在下面的案例中&#xff0c;鸭子&#xff0c;猫&#xff0c;狗都是动物…

webgl three 几何体

辅助几何体 // AxesHelper&#xff1a;辅助观察的坐标系const axesHelper new THREE.AxesHelper(400);scene.add(axesHelper);//辅助观察网格const gridHelper new THREE.GridHelper(300, 25, 0x004444, 0x004444);scene.add(gridHelper); 基础几何体 //长方体const geomet…

时光初创知识付费模板 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…

西北农林科技大学2024学年C++面向对象程序设计OJ——T15 英文文本单词统计(STL)

一.题目描述 Description 读入一篇英文文章&#xff0c;基于STL中的容器和算法&#xff08;建议包含<map>、<algorithm>、<string>和<sstream>&#xff09;&#xff0c;删除所有标点符号&#xff0c;主要包括英文逗号“,”、句号“.”、分号“;”、感…

docker和containerd的区别

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

Linux 三十六章

​​​​​​​ &#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要…

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

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

人从胚胎开始就要交税,直到死亡,是这样吗?

文章目录 梗概税收的基本概念从胚胎到死亡的税收分析胚胎到出生出生到成年成年到死亡 总结 梗概 人从胚胎阶段开始交税直到死亡&#xff0c;这个观点听起来有些戏剧化&#xff0c;但如果我们广义地理解“交税”这个概念&#xff0c;可以从不同的角度进行探讨。实际上&#xff…

ts中的class类

class Animal {constructor(public name: string) {}move(distance: number) {console.log(${this.name} moved ${distance} meters.);} } //这个输出如何输出 这段代码定义了一个名为 Animal 的类&#xff0c;它具有一个构造函数和一个 move 方法。构造函数使用 TypeScript 中…

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的深层挖掘和…

高通WLAN框架学习(3)- -WLAN FTM 模式(补充)

前提概要: 看过之前那篇文章的都知道FTM的启动模式 高通WLAN框架学习(3)- -WLAN FTM 模式_wifi ftm-CSDN博客 但是目前现在高通主要是通过ptt_socket_app模式启动FTM的 类容介绍如下: 2.2.1 启动 WLAN FTM 在使用任何3种方法进入FTM前,用单板GUI关掉设置菜单里的WI-F…

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

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

基于jpcap实现的网络嗅探器

项目功能 基于jpcap实现的网络嗅探器,项目主要主要功能为网络抓包&#xff0c;可以抓取5层协议的数据包&#xff0c;包括TCP、UDP、ICMP、IP、ARP等常见协议&#xff0c; 并支持按照协议、源IP、目的IP或关键字对抓取的包筛选。项目另外实现了基于Java Swing的GUI&#xff0c;…