JsonCpp的基本用法

2023-05-16

1、JsonCpp
C++库,允许操作JSON值,包括与字符串串行化和序列化。它可在反序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的便捷方式。是一个第三方JSON解析库,可将源码编译成方便使用动态链接库、静态链接库或者静态导入库的。jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下。
JsonCpp(1.8.4版本):https://github.com/open-source-parsers/jsoncpp/tree/1.8.4

2、JsonCpp编译工具
(1)Cmake
是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。
(2)Mesos
scons:Python写的自动化构建工具,是一个更简便,更可靠,更高效的编译软件,可用于编译jsoncpp。
(3)Doxygen
用于带注释的C++源生成文档的事实上的标准工具。程序的文件产生工具,可将程序中的特定注释转换为说明文件。能依据程序本身的结构,将注释经过处理重新整理成为一个纯粹的参考手册。
3、JsonCpp编译
除了使用以上工具编译外,还可以使用visual studio编译。
(1)用VS打开jsoncpp-1.8.4\makefiles\vs71 /jsoncpp.sln 便可以开始编译。
(2)打开vs2013 点击项目lib_json右键-属性-C/C++ -代码生成 选择多线程调试(MTD)
(3)调试修改为 debug右键按下鼠lib_json 选择生成,则在jsoncpp-1.8.4\build\vs71\debug\lib_json生成json_vc71_libmtd.lib(注意最后为libmtd)。vs2013自动编译项目。(如果为release,则相对于生成releas版本为json_vc71_libmt.lib(最后为libmt))
在这里插入图片描述
(4)编译后在jsoncpp-1.8.4\build\vs71\release\lib_json找到json_vc71_libmtd.lib将其复制到vs工程的的lib里(即直接复制到项目中)
在这里插入图片描述
(5)在项目中右击—配置—配置属性—C/C++ --代码生成—运行库—多线程(/MTD)(注意与上面的lib的生成版本有关,要改为对应的形式)
在这里插入图片描述
(6)在项目中右击—配置—配置属性–链接器–输入—附加依赖项,最后添加json_vc71_libmtd.lib,(或者在cpp源代码中添加#pragma comment(lib, “json_vc71_libmtd.lib”))
在这里插入图片描述
(7)将jsoncpp的头文件include复制到vs的include.,并在项目中引入,然后就可以使用了
在这里插入图片描述
4、JsonCpp基础
jsonCpp主要包含三种类型的class:value、reader、write。jsonCpp总所有对象、类名都在namespace json中,使用时只要包含json.h即可。
(1)Json::Value
Json::Value时jsonCpp中最基本、最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见 Json::ValueType 枚举值。
例:

Json::Value root;
root["status"] = 1;			//新建一个key为status,赋予数值1
root["message"] = "OK";		//新建一个key为message,赋予字符串OK
root["array"].append("arr"); //新建一个key为array,类型为数组,对第一个元素赋值为字符串“arr”
root["array"].append(1234);  // 为数组 key_array 赋值,对第二个元素赋值为:1234。
Json::ValueType type = root.type();	//获得root的类型

注:a、跟C++ 不同,JavaScript 数组可以为任意类型的值,所以 jsoncpp 也可以。
jsoncpp 还有一些其他同能,比如说设置注释、比较 json 大小、交换 json 对象等
b、在把value插入值后再输出来,输出的值是按字母表的顺序排列。
c、Json::ValueType:value的类型,是一个枚举型

enum ValueType {
  nullValue = 0, ///< 'null' value
  intValue,      ///< signed integer value
  uintValue,     ///< unsigned integer value
  realValue,     ///< double value
  stringValue,   ///< UTF-8 string value
  booleanValue,  ///< bool value
  arrayValue,    ///< array value (ordered list)
  objectValue    ///< object value (collection of name/value pairs).
};

(2)Json::Writer
a、Json::Writer负责将内存中的Value对象转换成JSON文档,输出到文件或者是字符串中。
b、Json::Writer是一个纯虚类,不能直接使用,一般使用Json::Writer的子类:Json::FasterWriter, Json::StyledWriter、Json::StyledStreamWriter
注:在新版中Json::FasterWriter, Json::StyledWriter、Json::Reader都被弃用,替代的是Json::StreamWriterBuilder、Json::CharReaderBuilder
c、Json::FasterWriter:速度最快
d、Json::StyledWriter:格式化后的json

(3)Josn::Reader
用于读取,准确说是用于将字符串或者文件输入流转换为Json::Value对象的。
parse()
a、使用Json::Reader对json文件进行解析
bool parse(const std::string& document, Value& root, bool collectComments = true);
参数:document: 包含要读取的文档的UTF-8编码字符串
root:(输出)Json::Value的对象

b、使用Json::Reader对json输入流(文件)进行解析
bool parse(std:stream& is, Value& root, bool collectComment = true);

c、使用Json::Reader对字符串进行解析
bool parse(const char* beginDoc, const char* ednDoc, Value& root, bool collectComment = true);

(4)JsonCpp其他操作
a、判断key是否存在
bool Json::Value::isMember ( const char * key) const;
存在返回1,否则返回0

b、判断是否为null成员函数
注:Json::Value和C++中的map有一个共同的特点,就是当你尝试访问一个不存在的 key 时,会自动生成这样一个key-value默认为null的值对。

c、得到所有成员
typedef std::vectorstd::string Json::Value::Members;
Value::Members Json::Value::getMemberNames ( ) const;
该函数的类型为一个string的vector。

d、删除成员
Value Json::Value::removeMember( const char* key)
返回删除的值,或者null

5、测试实例

#include <iostream>
#include <fstream>
#include <string>
#include "json/json.h"

using namespace std;

int main()
{
	const char* age;
	Json::Value root;
	Json::FastWriter fast_writer;
	Json::StyledWriter style_writer;
	Json::StyledStreamWriter stream_writer;
	Json::Reader reader;
	Json::Value json_object;

	root["null"] = NULL;			//注意此处在输出是显示为0,而非null
	root["message"] = "OK";
	root["age"] = 52;
	root["array"].append("arr");	// 新建一个key为array,类型为数组,对第一个元素赋值为字符串“arr”
	root["array"].append(123);		// 为数组 key_array 赋值,对第二个元素赋值为:1234

	Json::ValueType type = root.type();				//root的类型

	cout << root.toStyledString() << endl;			//格式化输出
	cout << "root_type:" <<type << endl;			//类型为7,即为类型为对象

	// 写到本地文件
	cout << "快速输出:" << endl;
	string str = fast_writer.write(root);
	cout << str << endl;		//快速输出,紧凑型
	ofstream ofs("fast_writer.json");
	ofs << str;
	ofs.close();

	cout << "格式化输出:" << endl;
	str = style_writer.write(root);
	cout << str << endl;		//格式化输出,排版型
	ofs.open("style_writer.json");
	ofs << str;
	ofs.close();


	// 对字符串解析
	//const char* json_document = "{\"age\" : 12, \"name\" : \"weng\"}";
	string json_document = "{\"age\" : 123, \"name\" : \"weng\"}";
	if (!reader.parse(json_document, json_object)){
		cout << "error" << endl;
		return 0;
	}
	else{
		cout <<"age:" <<json_object["age"] << " name" << json_object["name"] << endl;
	}
	
	// 对文件解析
	ifstream ifs("E:\\demo\\JsonTest\\JsonTest\\example.json", ios::binary);
	if (!reader.parse(ifs, json_object)){
		cout << "open error" << endl;
		ifs.close();
	}else{
		cout << "encoding:" << json_object["encoding"].asString() << endl;
		cout << "age:" <<json_object["age"].asInt() << endl;
		int num = json_object["plug"].size();
		for (int i = 0; i < num; i++){
			cout << json_object["plug"][i].asString() << " ";
		}
		ifs.close();
		cout << endl;
	}

	// 判断key是否存在
	bool is_age =  root.isMember("age");
	cout << "isMember:" <<is_age << endl;

	// 判断是否为null
	//bool is_null = root["null"].isNull();			//注意此处被赋值为0,而非null
	bool is_null = json_object["null"].isNull();
	cout << "is_null:" << is_null << endl;

	// 得到所有的key
	for (auto elem : root.getMemberNames()){
		cout << elem << " ";
	}
	cout << endl;

	// 删除成员
	cout << "remove_age:" << root.removeMember("age") << endl;


	system("pause");
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JsonCpp的基本用法 的相关文章

  • 还敢搞黄色?4 个色情网站被一锅端,9 名福利姬被刑拘!

    点击上方 五分钟学算法 xff0c 选择 星标 公众号 重磅干货 xff0c 第一时间送达 来源 xff1a 扩展迷EXTFANS 9月4日 xff0c 据 64 江苏网警 通报 xff1a 今年3月份以来 xff0c 浙江丽水莲都警方根据
  • 为什么有人劝别选计算机专业?

    大家好 xff0c 我是程序员吴师兄 xff0c 一个坚持在 CSDN 日更原创的程序员 今天想和大家聊一聊为什么有人劝别选计算机专业 和大家说一句掏心窝的话 xff1a 直到 2021 年 xff0c 计算机专业依旧是寒门改变命运的一个最
  • 看完谷歌大佬的 LeetCode 刷题笔记,我马上去字节跳动面试!

    如果你刷 LeetCode 觉得吃力 那么一定需要这份谷歌大佬的 LeetCode 刷题笔记 微信搜索 五分钟学算法 xff0c 公众号回复 04 即可获取对应的下载链接 xff0c 以下是详细介绍 在这里推荐一个谷歌大佬的刷题笔记 每一道
  • 剑指 Offer 09. 用两个栈实现队列(视频讲解)

    一 题目描述 用两个栈实现一个队列 队列的声明如下 xff0c 请实现它的两个函数 appendTail 和 deleteHead xff0c 分别完成在队列尾部插入整数和在队列头部删除整数的功能 若队列中没有元素 xff0c delete
  • 刷到 LeetCode 这个评论,被笑到了

    大家好 xff0c 我是吴师兄 今天早上我在 LeetCode 第 141 号问题 环形链表 的评论区中发现了一个称得上是天秀的解法 xff0c 简直太骚气了 xff0c 忍不住分享给大家 首先给没有见过这道题目的小伙伴补充一下前置知识 x
  • Android JNI基础篇(一)

    Android JNI 基础篇 前言 JNI学习其实并不难 xff0c 在这里 xff0c 我将引导大家学习JNI的基础知识 xff0c 认真学完本教程 xff0c 你将更加坚信我说的话 来吧 xff0c 我们一起学习 xff01 JNI
  • ROS学习(三):消息通信过程

    主节点管理节点信息 xff0c 每个节点根据需要与其他节点进行连接和消息通信 在这里 xff0c 我们来看看最重要的主节点 节点 话题 服务和动作信息的过程 一 运行主节点 节点之间的消息通信当中 xff0c 管理连接信息的主节点是为使用R
  • HTTP Digest authentication(摘要认证)和HTTP basic Authorization(普通认证)用户登出注销的方法

    最近项目中需要对普通认证HTTP basic Authorization和摘要认证HTTP Digest authenticatio登录进行注销 搜索到有几篇文章号称ie xff0c Firefox chrome都可以可以注销 xff0c
  • POCO C++库学习和分析 -- 序

    POCO C 43 43 库学习和分析 序 1 POCO库概述 xff1a POCO是一个C 43 43 的开源库集 同一般的C 43 43 库相比 xff0c POCO的特点是提供了整一个应用框架 如果要做C 43 43 程序应用框架的快
  • 【ubuntu18+QT12+OpenCV4环境配置】

    ubuntu18 43 QT12 43 OpenCV4环境配置 前些天编译了最新版本opencv4 xff0c 但是电脑内还有个opencv3 2 xff0c 有时候二者共享链接库文件即libopencv so XX xff0c 之类的路径
  • Ubuntu无法使用浏览器上网

    1 可以更新一下浏览器 xff0c 打开终端 xff0c 输入 xff1a sudo apt get install firefox 如果你用的是其他浏览器可以吧后面的 firefox 改为其他浏览器 xff0c 如谷歌浏览器 xff1a
  • 浅析C++中struct和class的区别

    文章目录 C和C 43 43 中struct的区别C 43 43 中struct和class的区别 C和C 43 43 中struct的区别 struct最早是在C语言中出现的 xff0c 但在C语言中struct只是一种 用户自定义数据类
  • C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

    本文可解决的问题 在一个头文件 h中定义一个结构体 在另一个 h文件中使用这个结构体引发错误C2143 语法错误 缺少 在 的前面 编译源文件 等莫名的报错头文件的交叉包含 即头文件a包含了头文件b 头文件b又包含了头文件a多个不同的头文件
  • 使用python进行http请求自动登录处理302跳转的问题

    一 问题背景 最近在做一个自动化业务处理的程序时 xff0c 需要完成对系统的自动登录 经过抓包测试只需要使用简单的post请求后收到的回包中包含cookie信息 xff0c 因此可以据此完成登录 程序设计思路为发送求到登录验证页面 xff
  • C# TCP/UDP网络通讯调试助手(含源码)

    C TCP UDP网络通讯调试助手 1 客户端界面 1 客户端界面 源码下载地址 xff1a https download csdn net download kingleitao 11927885
  • socketcan

    参考 lt lt Linux Can编程详解 gt gt CAN原理介绍 https www cnblogs com spoorer p 6649303 html 一 初始化工作 SocketCAN 中大部分的数据结构和函数在头文件 lin
  • vscode+cmake 实现C++项目的完整编译

    1 项目目录 span class token builtin class name span bin build CMakeLists txt include array 2d h common h swap h lib src arra
  • 航模常用硅胶线、热缩管规格

    一般穿越机中信号线等用26或28awg xff0c 外径1 3 1 5mm xff0c 配套热缩管选用2mm的比较合适 供电电源线一般用10awg或12awg xff0c 外径4 5 5 4mm xff0c 配套热缩管为7mm比较合适 14
  • POCO C++库学习和分析 -- 线程 (一)

    POCO C 43 43 库学习和分析 线程 xff08 一 xff09 线程是程序设计中用的非常多的技术 xff0c 在UI设计 xff0c 网络通讯设计中广泛使用 在POCO库中 xff0c 线程模块可以分成6个部分去理解 锁 xff0
  • 100条经典C语言笔试题目

    100 条经典C语言笔试题目 题目来源 xff1a 1 中兴 华为 慧通 英华达 微软亚洲技术中心等中 外企业面试题目 xff1b 2 C 语言面试宝典 林锐 高质量编程第三版 说明 xff1a 1 部分C 语言面试题中可能会参杂部分和C

随机推荐

  • hadoop2.7完全分布式集群搭建以及任务测试

    要想深入的学习hadoop数据分析技术 xff0c 首要的任务是必须要将hadoop集群环境搭建起来 xff0c 本文主要讲述如何搭建一套hadoop完全分布式集群环境 环境配置 xff1a 2台64位的redhat6 5 43 1台64位
  • /etc/passwd, /etc/shadow

    使用者帐号 xff1a etc passwd etc shadow 由上面的说明您大概已经知道 xff0c 嘿嘿 xff01 帐号管理最重要的两个档案就是 etc passwd 与 etc shadow 了 xff01 这两个档案可以说是
  • 密集负载下的网卡中断负载均衡smp affinity及单队列RPS

    简单的说就是 xff0c 每个硬件设备 xff08 如 xff1a 硬盘 网卡等 xff09 都需要和 CPU 有某种形式的通信以便 CPU 及时知道发生了什么事情 xff0c 这样 CPU 可能就会放下手中的事情去处理应急事件 xff0c
  • 基于stm32f103zet6之最小系统的制作

    因为嵌入式老师一直鼓励我们去学习stm32 xff0c 他说这是一款很不错的片子 xff0c 所以就萌生了学习stm32的念头 xff0c 之前一直在学习基于arm11的OK6410 xff0c 裸机跑到触摸屏就没有再继续了 xff0c 感
  • 基于stm32f103zet6的DS1302学习

    由于硬件出了问题 xff0c 也就是外部低速晶振没用 xff0c 震不起来 xff0c 然后查看了网上的帖子 xff0c STM32的RTC果然口碑不怎么样 xff0c 所以果断换DS1302 xff0c 在移植的过程中还算顺利 xff0c
  • 基于stm32f103zet6之使用FSMC驱动TFT的学习

    在完成IO驱动彩屏的试验后 xff0c 就准备着手使用FSMC来驱动彩屏 xff0c 先了解一下预备知识 一 所谓的FSMC机制 简单介绍FSMC在这篇博文里面很清楚 xff0c 推荐一下 http blog csdn net king b
  • (转)ds18b20时序说明

    ds18b20时序说明 新手在DS18B20读写过程中要犯很多错误 老衲普度众生 xff0c 简要说明它怎么用 1 过程1 2是初始化过程 xff0c 每次读取都要初始化 xff0c 否则18b20处于待机状态 xff0c 无法成功读取 过
  • H桥驱动芯片IR2110功能简介

    1 1 驱动芯片IR2110功能简介 在功率变换装置中 xff0c 根据主电路的结构 xff0c 起功率开关器件一般采用直接驱动和隔离驱动两种方式 美国IR公司生产的IR2110驱动器 xff0c 兼有光耦隔离和电磁隔离的优点 xff0c
  • 关于示波器是否必须要接地线的疑问

    这是一个非常隐蔽的问题 xff0c 稍不注意 xff0c 在接入示波器时 xff0c 就会导致线路板上的某些芯片突然爆炸 xff0c 不仅会对项目产生非常大的影响 xff0c 也足以让我们着实郁闷上几天 所以 xff0c 应该足够引起电路设
  • POCO C++库学习和分析 -- 进程

    POCO C 43 43 库学习和分析 进程 Poco Foundation库中涉及进程的内容主要包括了4个主题 xff0c 分别是进程 Process 进程间同步 xff08 inter process synchronization x
  • Mysql安装后在服务里找不到和服务启动不起来的解决方法

    一 安装完MySQL后找不到服务 在那完MySQL数据库后 xff0c 在计算机管理 61 61 服务和应用程序 61 61 服务中找不到MySQL的服务 解决方法 xff1a 1 以管理员的身份运行cmd或者Windows powersh
  • C++中虚继承

    一 虚继承和虚基类 1 多继承产生的冲突 在C 43 43 中多继承时很容易产生命名冲突 xff0c 即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字 xff0c 命名冲突依然有可能发生 xff0c 比如典型的是菱形继承 x
  • 跨平台C++单元测试框架——GTest

    1 简介 GTest是google公司发布的一个跨平台的 Liunx Mac OS X Windows Cygwin Windows CE and Symbian C 43 43 单元测试框架 它提供了丰富的断言 致命和非致命判断 参数化
  • 音频格式之AAC(高级音频编码技术)

    1 简介 ACC xff08 Advanced Audio Coding xff0c 高级音频编码 xff09 是杜比实验室为音乐社区提供的技术 xff0c 出现于1997年 xff0c 基于MPEG 2的音频编码技术 2000年 xff0
  • C++11之lambda回调设置与应用

    在程序中有时候我们需要实现回调效果 xff0c 比如先设置监听 xff0c 然后在后面具体执行完某个操作后再将该操作的结果通知给前面监听中 这种机制实际很常用 xff0c 比如window底下的消息机制 xff0c Qt中的信号槽的机制都有
  • 高速的C/C++编译工具——ccache

    1 简介 ccache xff08 compiler cache 的缩写 xff09 是一个编译器缓存 xff0c 该工具会高速缓存编译生成的信息 xff0c 并在编译的特定部分使用高速缓存的信息 xff0c 比如头文件 xff0c 这样就
  • Django17:内建用户系统

    1 定义 Django带有一个用户认证系统 它处理用户账号 组 权限以及基于cookie的用户会话 用户可以直接是使用Django自带的用户表 2 基本字段 模型类位置from django contrib contrib auth mod
  • Django18:文件上传

    1 上传规范 xff08 1 xff09 前端HTML 文件上传必须为POST提交方式 表达 lt form gt 中文件上传时必须带有enctype 61 multipart formdata 时才会包含文件内容数据 表单中用 lt in
  • Django19:发送邮件

    1 邮件相关协议 xff08 1 xff09 SMTP SMTP xff08 Simple Mail Transfer Protocol xff09 xff0c 简单邮件传输协议 xff08 25号端口 xff09 它是一组用于从原地址到目
  • JsonCpp的基本用法

    1 JsonCpp C 43 43 库 xff0c 允许操作JSON值 xff0c 包括与字符串串行化和序列化 它可在反序列化 序列化步骤中保留现有注释 xff0c 使其成为存储用户输入文件的便捷方式 是一个第三方JSON解析库 xff0c