# JSONcpp
# 开发环境配置
# 现成版百度网盘
jsoncpp 现成配置环境 VS2022 开发环境 x64
链接:https://pan.baidu.com/s/1-DjqbRVVSmDizcD8wbEGFg?pwd=5213 提取码:5213
# 环境配置版
# 下载 Jsoncpp
git clone https://github.com/open-source-parsers/jsoncpp |
# cmake 进行编译
# 下载 cmake
cmake 下载链接[1]
# 解析出动态
- 安装
cmake
默认安装即可 - 将
jsoncpp所在文件夹,以及生成
jsoncpp.dll 和 jsoncpp.lib` 等动态文件的文件夹 - 第一个为 VS 的版本,第二个默认
x64
不用填
- 配置不动,点击
生成
即可,会发现生成文件逐步完成
打开
生成文件的项目
- 将
jsoncpp_dll
设置为启动项
,并右键点击第一个生成
即可完成静态文件的生成
- 可以在 C 盘
新建
一个存放环境的位置 cpp - 将下载
clone
的 jsoncpp 文件下的 include 文件全部放入 C 盘文件夹 cpp 中 (此文件为 jsoncpp 的头文件) - 将生成文件之后项目文件夹中
bin\Debug
下的jsoncpp.dll
复制到 C 盘文件夹 cpp 下与include同级
的lib
文件夹 (自己创建) 下 - 将生成文件之后项目文件加中 lib\Debug 下的
jsoncpp.lib
复制到 C 盘 cpp 文件夹lib
文件下下
# VS2022 环境配置
- 右键点击项目进入属性配置
# 最后配置
运行下面的实例代码很可能出现 “运行程序无法启动的问题”, 将 (刚才 C 盘中)
jsoncpp.dll
文件复制到main.cpp
对应的资源文件夹下即可
# 实例代码
#include <json/json.h> | |
#include <fstream> | |
#include <iostream> | |
using namespace std; | |
using namespace Json; | |
// 对于 Json 数组而言,内部的顺序是有序的,这个顺序就是添加数据的顺序 | |
void writeJson() | |
{ | |
// 定义 Value 对象 | |
Value root; | |
// 使用 append 方法向 Value 包装器 li 填充数据 | |
root.append("luffy"); | |
root.append(19); | |
root.append(170); | |
root.append(false); | |
// 又定义一个 subArray 的 Value 对象 | |
Value subArray; | |
subArray.append("ace"); | |
subArray.append("sabo"); | |
// 将 subArray 对象增加到 root 里面 | |
root.append(subArray); | |
Value obj; | |
// 定义键值对 | |
obj["sex"] = "man"; | |
obj["girlfriend"] = "Hancock"; | |
// 将 obj 对象的键值对增加到 root 里面 | |
root.append(obj); | |
#if 1 | |
// 对上面数据格式序列化使用 toStyledString 方法得到带格式的字符串 | |
string json = root.toStyledString(); | |
#else | |
// 得到不带格式的字符串 | |
FastWriter w; | |
// 通过 write 方法得到不带换行符的字符串 | |
string json = w.write(root); | |
#endif | |
// 写文件 | |
//write -> ostream | |
//read -> ifstream | |
// 将 json 数据写入 test.json | |
ofstream ofs("test.json"); | |
// 写入格式化后带格式的字符串 | |
ofs << json; | |
// 关闭文件 | |
ofs.close(); | |
} | |
/* 保存到的 json 数据 | |
[ | |
"luffy", | |
19, | |
170, | |
false, | |
[ | |
"ace", | |
"sabo" | |
], | |
{ | |
"girlfriend" : "Hancock", | |
"sex" : "man" | |
} | |
] | |
*/ | |
void readJson() | |
{ | |
// 读,打开 test.json | |
ifstream ifs("test.json"); | |
Reader rd; | |
Value root; | |
// 将 json 数据解析到 root 里面 | |
rd.parse(ifs, root); | |
// 判断解析的 root value 类是否是 Array | |
if (root.isArray()) | |
{ | |
//size 方法判断 | |
for (unsigned i = 0; i < root.size(); ++i) | |
{ | |
Value item = root[i]; | |
// 对类型进行判断,并对对应的类型进行输出 | |
if (item.isInt()) | |
{ | |
cout << item.asInt() << " ,"; | |
} | |
else if (item.isString()) | |
{ | |
cout << item.asString() << " ,"; | |
} | |
else if (item.isBool()) | |
{ | |
cout << item.asBool() << " ,"; | |
} | |
else if (item.isArray()) | |
{ | |
for (unsigned j = 0; j < item.size(); ++j) | |
{ | |
cout << item[j].asString() << ", "; | |
} | |
} | |
else if (item.isObject()) | |
{ | |
//Return a list of the member names. | |
Value::Members keys = item.getMemberNames(); | |
for (int k = 0; k < keys.size(); ++k) | |
{ | |
cout << keys.at(k) << "," << item[keys[k]]; | |
} | |
} | |
cout << endl; | |
} | |
} | |
} | |
int main() | |
{ | |
writeJson(); | |
printf("json写入完毕"); | |
readJson(); | |
return 0; | |
} |
# 具体用法
# 声明命名空间
using namespace Json; |
# jsoncpp 的三个类
# Value类
Value类
:封装Json
支持的所有类型,方便后序处理数据
# Value 检测类型
使用
Value.isNull()
判断是够为空,输出bool值
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; | |
#if defined(JSON_HAS_INT64) | |
Int64 asInt64() const; | |
UInt64 asUInt64() const; | |
#endif // if defined(JSON_HAS_INT64) | |
LargestInt asLargestInt() const; | |
LargestUInt asLargestUInt() const; | |
float asFloat() const; | |
double asDouble() const; | |
bool asBool() const; |
# FastWriter 类
将
Value
对象中的数据序列化为字符串
std::string Json::FastWriter::write(const Value& root); |
- 将数据格式化,不带换行符,编程单行
# Reader 类
反序列化,将
json字符串
解析为Value类型
# parse
方法
bool Json::Reader::parse(const std::string& decument,Value& root,bool collectComments=true); |
参数:
document:json
格式字符串,打开
的 json 文件- root:传出参数,
存储
了 json 字符串解析
出的数据 - collectComments:是否保存
注释信息
,默认True
bool parse(const char* beginDoc, const char* endDoc, Value& root,bool collectComments = true); |
参数:
- bneginDoc 和 endDoc
指针定位
json 字符串,解析部分
json 字符串
//brief Parse from input stream. | |
//see Json::operator>>(std::istream&, Json::Value&). | |
bool parse(IStream& is, Value& root, bool collectComments = true); |
https://cmake.org/download/ ↩︎