json的使用和资源提供

json的使用和资源提供

背景:

项目中使用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与多编码支持
与自定义类型转换
示例代码
常见问题
更多
计划

快速上手
引入 configor 头文件
#include "configor/json.hpp"
using namespace configor;
使用 C++ 的方式的创建 JSON 对象

使用 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();
JSON 对象的取值与类型转换

通过 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;
Unicode与多编码支持

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>;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值