jsoncpp的配置和使用

json的全称为:JavaScript Object Notation,是一种轻量级的数据交互格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。【以上来自于百度百科】
简单来说:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。

1. 下载和编译

Jsoncpp 是个跨平台的 C++ 开源库,提供的类为我们提供了很便捷的操作,而且使用的人也很多。在使用之前我们首先要从 github 仓库下载源码

https://github.com/open-source-parsers/jsoncpp




下载的文件中,包含一个cmakelist的txt文件,因为对于大型的项目而言,不能够通过vs直接打开源码,需要通过cmake进行工程的构建并且在vs中进行编译动态库

下载 cmake 工具

CMake 工具的官方下载地址如下:

https://cmake.org/download/











jsoncpp 的使用

jsoncpp 库中的类被定义到了一个 Json 命名空间中,建议在使用这个库的时候先声明这个命名空间:
using namespace Json;

使用 jsoncpp 库解析 json 格式的数据,我们只需要掌握三个类:

Value 类:将 json 支持的数据类型进行了包装,最终得到一个 Value 类型
FastWriter类:将 Value 对象中的数据序列化为字符串
Reader类:反序列化,将 json 字符串 解析成 Value 类型

Value 类

这个类可以看做是一个包装器,它可以封装 Json 支持的所有类型,

构造函数

// 因为Json::Value已经实现了各种数据类型的构造函数
Value(ValueType type = nullValue);
Value(Int value);
Value(UInt value);
Value(Int64 value);
Value(UInt64 value);
Value(double value);
Value(const char* value);
Value(const char* begin, const char* end);
Value(bool value);
Value(const Value& other);
Value(Value&& other);

检测保存的数据类型

// 检测保存的数据类型
bool isNull() const;
bool isBool() const;
bool isInt() const;
bool isInt64() const;
bool isUInt() const;
bool isUInt64() const;
bool isIntegral() const;
bool isDouble() const;
bool isNumeric() const;
bool isString() const;
bool isArray() const;
bool isObject() const;

将 Value 对象转换为实际类型

Int asInt() const;
UInt asUInt() const;
Int64 asInt64() const;
UInt64 asUInt64() const;
LargestInt asLargestInt() const;
LargestUInt asLargestUInt() const;
JSONCPP_STRING asString() const;
float asFloat() const;
double asDouble() const;
bool asBool() const;
const char* asCString() const;

对 json 数组的操作

ArrayIndex size() const;
Value& operator[](ArrayIndex index);
Value& operator[](int index);
const Value& operator[](ArrayIndex index) const;
const Value& operator[](int index) const;
Value get(ArrayIndex index, const Value& defaultValue) const;
Value& append(const Value& value);
const_iterator begin() const;
const_iterator end() const;
iterator begin();
iterator end();

对 json 对象的操作

Value& operator[](const char* key);
const Value& operator[](const char* key) const;
Value& operator[](const JSONCPP_STRING& key);
const Value& operator[](const JSONCPP_STRING& key) const;
Value& operator[](const StaticString& key);// 通过key, 得到value值
Value get(const char* key, const Value& defaultValue) const;
Value get(const JSONCPP_STRING& key, const Value& defaultValue) const;
Value get(const CppTL::ConstString& key, const Value& defaultValue) const;// 得到对象中所有的键值
typedef std::vector<std::string> Members;
Members getMemberNames() const;

将 Value 对象数据序列化为 string

// 序列化得到的字符串有样式 -> 带换行 -> 方便阅读
// 写配置文件的时候
std::string toStyledString() const;

FastWriter 类

// 将数据序列化 -> 单行
// 进行数据的网络传输
std::string Json::FastWriter::write(const Value& root);

Reader 类

bool Json::Reader::parse(const std::string& document,Value& root, bool collectComments = true);参数:- document: json格式字符串- root: 传出参数, 存储了json字符串中解析出的数据- collectComments: 是否保存json字符串中的注释信息// 通过begindoc和enddoc指针定位一个json字符串
// 这个字符串可以是完成的json字符串, 也可以是部分json字符串
bool Json::Reader::parse(const char* beginDoc, const char* endDoc,Value& root, bool collectComments = true);// write的文件流  -> ofstream
// read的文件流   -> ifstream
// 假设要解析的json数据在磁盘文件中
// is流对象指向一个磁盘文件, 读操作
bool Json::Reader::parse(std::istream& is, Value& root, bool collectComments = true);

VS 的配置




示例代码

[12, 12.34, true, "tom", ["jack", "ace", "robin"], {"sex":"man", "girlfriend":"lucy"}
]
#include <json/json.h>
#include <fstream>
using namespace Json;int main()
{writeJson();readJson();
}
void writeJson()
{// 将最外层的数组看做一个Value// 最外层的Value对象创建Value root;// Value有一个参数为int 行的构造函数root.append(12); // 参数进行隐式类型转换root.append(12.34);root.append(true);root.append("tom");// 创建并初始化一个子数组Value subArray;subArray.append("jack");subArray.append("ace");subArray.append("robin");root.append(subArray);// 创建并初始化子对象Value subObj;subObj["sex"] = "woman";  // 添加键值对subObj["girlfriend"] = "lucy";root.append(subObj);// 序列化
#if 1// 有格式的字符串string str = root.toStyledString();
#elseFastWriter f;string str = f.write(root);
#endif// 将序列化的字符串写磁盘文件ofstream ofs("test.json");ofs << str;ofs.close();
}
void readJson()
{// 1. 将磁盘文件中的json字符串读到磁盘文件ifstream ifs("test.json");// 2. 反序列化 -> value对象Value root;Reader r;r.parse(ifs, root);// 3. 从value对象中将数据依次读出if (root.isArray()){// 数组, 遍历数组for (int i = 0; i < root.size(); ++i){// 依次取出各个元素, 类型是value类型Value item = root[i];// 判断item中存储的数据的类型if (item.isString()){cout << item.asString() << ", ";}else if (item.isInt()){cout << item.asInt() << ", ";}else if (item.isBool()){cout << item.asBool() << ", ";}else if (item.isDouble()){cout << item.asFloat() << ", ";}else if (item.isArray()){for (int j = 0; j < item.size(); ++j){cout << item[j].asString() << ", ";}}else if (item.isObject()){// 对象// 得到所有的keyValue::Members keys = item.getMemberNames();for (int k = 0; k < keys.size(); ++k){cout << keys.at(k) << ":" << item[keys[k]] << ", ";}}}cout << endl;}
}

C++中配置json以及使用相关推荐

  1. vscode中setting.json配置详解

    vscode中的setting.json配置文件配置详解 话不多说上配置文件 大家按需复制到自己的setting.json配置文件中即可 [{// 控制是否在编辑器中显示 CodeLens." ...

  2. (三)01 -Vue项目打包发布移动App——vue.config.js中配置相对路径publicPath为空字符串 在public中添加HBuilderX的打包配置文件manifest.json

    Vue 项目打包发布移动 App--npm run build打包 & vue.config.js文件中配置相对路径publicPath为空字符串 & 在 public中添加HBuil ...

  3. golang 同一个包中函数互相调用报错 undefined 以及在 VSCode 中配置右键执行整个包文件

    1. 代码结构 demo 文件夹下有两个文件,分别为 hello.go 和 main.go ,结构如下: wohu@wohu:~/GoCode/src$ tree demo/ demo/ ├── he ...

  4. 在C语言中解析json配置文件

    业务需求 在C或者C++项目中常常需要解析配置文件,我们常见的配置文件格式一般就是.ini,xml,lua或者是一般的text文件,这些格式比较恼人的一个问题就是数据格式过于冗余,或者功能不够强大,不 ...

  5. Angular应用中配置全局路径映射

    Angular应用中配置全局路径映射 1. tsconfig.json文件配置说明 2. 配置全局路径映射 2.1 指定baseUrl属性值 2.2 配置paths属性值 2.3 使用示例 为了避免移 ...

  6. 微服务架构中配置中心的选择

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/XsTR 目前公司内部微服务架构基础设 ...

  7. springboot 添加拦截器之后中文乱码_springboot中配置了拦截器后,拦截器无效的解决方案之一...

    springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...

  8. c# 指定打开某个路径下的CMD_(win10下sublime通过配置JSON调用MATLAB直接运行程序)(转载)...

    SUBLIME作为文本编辑器,本身并不具备仿真功能.但通过配置JSON,可以调用任一程序. https://blog.csdn.net/solinger/article/details/8945016 ...

  9. Vue 单文件组件||Vue 单文件组件的基本用法||webpack 中配置 vue 组件的加载器|| 在 webpack 项目中使用 vue

    Vue 单文件组件 传统组件的问题和解决方案 1. 问题 1. 全局定义的组件必须保证组件的名称不重复 2. 字符串模板缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的 \ 3. 不支持 CS ...

最新文章

  1. Docker安装weblogic(五)
  2. 未分配内存的指针导致段错误
  3. centos7 mysql安装配置_mysql 5.7.17 安装配置方法图文教程(CentOS7)
  4. EPROCESS ETHREAD简介
  5. Winform中设置多条Y轴时新增的Y轴刻度不显示问题解决
  6. 如何在gvim中安装autoproto自动显示函数原型
  7. 微信小程序学习笔记(七)
  8. C++四种强制类型转换
  9. 2021辽宁大洼高中高考成绩查询,2021大洼高中最后一跑——励志高考,逆袭人生...
  10. 定时器控件 Timer 1130
  11. pytorch中的卷积操作详解
  12. libRTMP 整体说明
  13. oracle-j2sdk1.8,cloudera-manager – 没有包oracle-j2sdk1.7可用?
  14. 【课程设计】 推箱子游戏(源码+详解)
  15. 如何从Apple电子钱包中删除旧登机牌
  16. 【Python 爬虫系列非专业教学】(3)手把手教你获取猫眼电影 Top 100 榜单
  17. 安卓逆向010之实战破解内购(斗地主)
  18. linux修改主机名临时/永久
  19. 说说Pluma插件管理框架
  20. pythonsklearn做手写识别_Python scikit-learn 学习笔记—手写数字识别

热门文章

  1. Maven项目无法引入 Maven Dependencies Libraries 问题
  2. python中的图形界面设计_python图形化界面设计(tkinter)一全面介绍
  3. 应用数学考研跨考计算机,数学专业考研三大方向_跨考网
  4. C++ 获取特定进程的CPU使用率
  5. 犹他大学计算机科学毕业,犹他大学计算机科学理学硕士研究生申请要求及申请材料要求清单...
  6. 通用图床服务架构解析(百万级回源/天)
  7. 使用Node.js手撸一个建静态Web服务器,内部CV指南
  8. 修改系统时区(基于Debian的系统)--用Enki学Linux系列(15)
  9. YXC | 蓝牙耳机晶振怎么选?
  10. iTerm2终端集成git缩写意思