-
Notifications
You must be signed in to change notification settings - Fork 67
Value operation (zh)
haibo2.liu edited this page Sep 29, 2022
·
2 revisions
以下示例均以 JSON 为例。
- 判断 JSON 对象的值类型
// 判断 JSON 值类型
j.type();
j.is_null();
j.is_bool();
j.is_integer();
j.is_floating();
j.is_number(); // is_integer() || is_floating()
j.is_string();
j.is_array();
j.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_floating() 时可用
auto d = j.get<double>(); // 仅当 j.is_floating() 时可用
auto s = j.get<std::string>(); // 仅当 j.is_string() 时可用
// 对于实现了 value_binder 的自定义数据类型,也可以直接取值
// 详情请参考下方 `与自定义类型转换`
class MyObject;
auto myObj = j.get<MyObject>();注意:get函数会强校验数据类型(例如整形和浮点数不能自动转换),参数类型与值类型不同时会引发 configor_type_error 异常。
同时 get 支持取出引用和指针类型:
j.get<const std::string&>();
j.get<std::string&>();
j.get<const std::string*>();
j.get<std::string*>();通过有参数的 get 函数,可以传入对象引用来取值:
int n = 0;
if (j.get(n))
{
// 成功读取到 n 的值
}
else
{
// 读取 n 值失败
}类型转换:
// 显式转换
bool b = (bool)j["boolean"];
int i = (int)j["number"];
float d = (float)j["float"];
// 对于实现了 value_binder 的自定义数据类型,也可以直接转换
// 详情请参考下方 `与自定义类型转换`
class MyObject;
MyObject myObj = (MyObject)j;
MyObject myObj = j;- size & empty & clear & count & ...
json::value arr = json::array{ 1, 2, 3 };
arr.size(); // 3
arr.empty(); // false
arr.erase(0); // 第一个元素被删除
arr.clear();
json::value 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;
}