项目中使用json,linux和pc都可正常使用
在gitee上有资料,这里只是转载记录,以便日后查找和使用。
https://gitee.com/mirrors_jinzhu/configor?_from=gitee_search#https://gitee.com/link?target=http%3A%2F%2Fgithub.com%2Fjinzhu
https://gitee.com/hackliker/configor?_from=gitee_search
一个为 C++11 量身打造的轻量级 config 库,轻松完成 JSON 解析和序列化功能,并和 C++ 输入输出流交互。
仅头文件,低接入成本
STL-like,低学习成本
与标准库 io 交互
非侵入式的序列化与反序列化
Unicode与多编码支持(支持char、wchar_t、char16_t和char32_t)
可扩展的输入输出方式
项目此前叫做 jsonxx,现已更名为 configor!
在保证原有 API 可用的情况下,将在未来支持包括 JSON 在内的各种常见对象存储格式(如 YAML 等)。
如果您之前已经在使用 jsonxx,那么升级到 configor 将非常简单,只需要修改头文件的声明如下:
// 替换掉注释中的头文件,改为使用下方的头文件即可
// #include "jsonxx/json.hpp"
// using namespace jsonxx;
#include "configor/json.hpp"
using namespace configor;
目录
快速上手
取值方式
常用方法和运算符
序列化与反序列化
序列化
反序列化
Unicode与多编码支持
与自定义类型转换
示例代码
常见问题
更多
计划
#include "configor/json.hpp"
using namespace configor;
使用 operator[] 为 JSON 对象赋值
json j;
j["number"] = 1;
j["float"] = 1.5;
j["string"] = "this is a string";
j["boolean"] = true;
j["user"]["id"] = 10;
j["user"]["name"] = "Nomango";
使用 std::initializer_list 为 JSON 对象赋值
// 使用初始化列表构造数组
json arr = { 1, 2, 3 };
// 使用初始化列表构造对象
json obj = {
{
"user", {
{ "id", 10 },
{ "name", "Nomango" }
}
}
};
// 第二个对象
json obj2 = {
{ "nul", nullptr },
{ "number", 1 },
{ "float", 1.3 },
{ "boolean", false },
{ "string", "中文测试" },
{ "array", { 1, 2, true, 1.4 } },
{ "object", {
{ "key", "value" },
{ "key2", "value2" },
},
};
使用辅助方法构造数组或对象
json arr = json::array({ 1 });
json obj = json::object({ { "user", { { "id", 1 }, { "name", "Nomango" } } } });
取值方式
判断 JSON 对象的值类型
// 判断 JSON 值类型
bool is_null();
bool is_bool();
bool is_integer();
bool is_float();
bool is_number(); // is_integer() || is_float()
bool is_string();
bool is_array();
bool is_object();
通过 get 函数可以直接取值:
auto b = j.get<bool>(); // 仅当 j.is_bool() 时可用
auto i = j.get<int>(); // 仅当 j.is_integer() 时可用
auto i = j.get<int64_t>(); // 仅当 j.is_integer() 时可用
auto f = j.get<float>(); // 仅当 j.is_float() 时可用
auto d = j.get<double>(); // 仅当 j.is_float() 时可用
auto s = j.get<std::string>(); // 仅当 j.is_string() 时可用
// 对于实现了 config_bind 的自定义数据类型,也可以直接取值
// 详情请参考下方 `JSON 与任意类型的转换`
class MyObject;
auto myObj = j.get<MyObject>();
注意:get函数会强校验数据类型(例如整形和浮点数不能自动转换),参数类型与值类型不同时会引发 configor_type_error 异常。
通过有参数的 get 函数,可以传入对象引用来取值:
int n = 0;
j.get(n); // 取值失败时抛出
通过 try_get 函数,可以判断是否成功取值:
int n = 0;
if (j.try_get(n))
{
// 成功读取到 n 的值
}
else
{
// 读取 n 值失败
}
通过 as 系列函数可以将数据类型尽可能的转换:
bool as_bool(); // 对bool直接返回,对数字类型判断是否非0,对null返回false,对其他类型返回empty()
int64_t as_integer(); // 对数字类型直接返回,对bool类型强转,对其他类型抛出
double as_float(); // 对数字类型直接返回,对bool类型强转,对其他类型抛出
std::string as_string(); // 对字符串类型直接返回,对数字类型和bool转换为字符串,对null返回空串,对其他类型抛出
类型转换:
// 显式转换
bool b = (bool)j["boolean"];
int i = (int)j["number"];
float d = (float)j["float"];
// 隐式转换(不推荐)
bool b = j["boolean"];
int i = j["number"];
float d = j["float"];
// 对于实现了 config_bind 的自定义数据类型,也可以直接转换
// 详情请参考下方 `JSON 与任意类型的转换`
class MyObject;
MyObject myObj = (MyObject)j;
MyObject myObj = j;
常用方法和运算符
size & empty & clear & count & …
json arr = json::array({ 1, 2, 3 });
arr.size(); // 3
arr.empty(); // false
arr.erase(0); // 第一个元素被删除
arr.clear();
json obj = json::object({ { "one", 1 }, { "two", 2 } });
obj.size(); // 2
obj.empty(); // false
obj.count("one"); // 1
obj.count("missing"); // 0
obj.erase("one"); // one 被删除
obj.clear();
比较运算符
j["boolean"] == true
j["number"] == 1
j["number"] != 2
j["number"] > 0
j["float"] < 3
JSON 对象类型和数组类型的遍历
// 增强 for 循环
for (auto& j : obj) {
std::cout << j << std::endl;
}
// 使用迭代器遍历
for (auto iter = obj.begin(); iter != obj.end(); iter++) {
std::cout << iter.key() << ":" << iter.value() << std::endl;
}
序列化为字符串
// 序列化为字符串
std::string json_str = j.dump();
// 美化输出,使用 4 个空格对输出进行格式化
std::string pretty_str = j.dump(4, ' ');
序列化到文件
std::ofstream ofs("output.json");
ofs << j << std::endl;
// 将 JSON 内容输出到文件,并美化
std::ofstream ofs("pretty.json");
ofs << std::setw(4) << j << std::endl;
序列化到输出流
json j;
std::cout << j; // 可以使用 std::setw(4) 对输出内容美化
反序列化
从字符串中解析
json j = json::parse("{ \"happy\": true, \"pi\": 3.141 }");
从文件中读取
std::ifstream ifs("sample.json");
json j;
ifs >> j;
从用户输入中读取
json j;
std::cin >> j;
configor 具有完备的 unicode 支持,同時支持 char、wchar_t、char16_t和char32_t。
对于 wchar_t 类型,可使用下面的别名来使用宽字符版本:
json // char
wjson // wchar_t
宽字符版本示例代码:
wjson j = wjson::parse(L"{ \"name\": \"中文测试\" }");
std::wstring str = j[L"name"].get<std::wstring>();
对 char16_t 和 char32_t 字符类型需要使用下面的别名
struct u16json_args : json_args
{
using char_type = char16_t;
};
struct u32json_args : json_args
{
using char_type = char32_t;
};
// char16_t
using u16json = configor::basic_config<u16json_args>;
// char32_t
using u32json = configor::basic_config<u32json_args>;