项目地址:nlohmann_json_cmake_fetchcontent/json.hpp at master · ArthurSonzogni/nlohmann_json_cmake_fetchcontent · GitHub
设计目标-
直观的语法。在像Python这样的语言中,JSON就像是一个一流的数据类型。我们使用了现代C++的所有操作符魔法,在您的代码中实现了相同的感觉。查看以下示例你会明白我的意思。
-
琐碎的集成。我们的整个代码由一个单独的头文件组成json.hpp。就这样。没有库,没有子项目,没有依赖,没有复杂的构建系统。这个类是用普通的C++11编写的。总之,一切都不需要调整你的编译器标志或项目设置。
-
严格的测试。我们的类经过包含100%的单元测试,包括所有异常行为。此外,我们与Valgrind还有xxx确认没有内存泄漏。谷歌OSS-模糊此外,对所有解析器24/7运行模糊测试,迄今为止高效地执行了数十亿次测试。为了保持高质量,该项目遵循(CII)最佳实践。
还有一些其他方面对我们来说并不重要:
-
内存效率。每个JSON对象都有一个指针(联合的最大大小)和一个枚举元素(1字节)的开销。默认泛化使用以下C++数据类型:
std::string
对应字符串,int64_t,uint64_t
或者double
对应数字,std::map
对于对象object,std::vector
对应数组,以及bool
对应布尔值。但是,您可以模板化通用类basic_json
满足你的需求。 -
速度。肯定有更快的JSON库在外面。但是,如果您的目标是通过添加带有单个头文件的JSON支持来加快开发速度,那么这个库就是您的不二之选。
json.hpp 唯一需要的文件。 只需要添加
#include
// for convenience
using json = nlohmann::json;
你想要处理json的文件中,并且设置支持C++即可。
您可以进一步使用文件include/nlohmann/json_fwd.hpp用于转发声明。json_fwd.hpp的安装(作为cmake安装步骤的一部分)可以通过设置-DJSON _ MultipleHeaders =ON
除了下面的示例,您可能还想查看文档,其中每个函数包含一个单独的代码示例(例如,查看emplace()
)。全部示例文件可以自己编译和执行(例如,文件emplace.cpp
)。
这里有一些例子可以让你知道如何使用这个类。
假设您想要用此库创建这样的JSON对象:
{
"pi": 3.141,
"happy": true,
"name": "Niels",
"nothing": null,
"answer": {
"everything": 42
},
"list": [1, 0, 2],
"object": {
"currency": "USD",
"value": 42.99
}
}
可以这样写:
// create an empty structure (null)
json j;
// add a number that is stored as double (note the implicit conversion of j to an object)
j["pi"] = 3.141;
// add a Boolean that is stored as bool
j["happy"] = true;
// add a string that is stored as std::string
j["name"] = "Niels";
// add another null object by passing nullptr
j["nothing"] = nullptr;
// add an object inside the object
j["answer"]["everything"] = 42;
// add an array that is stored as std::vector (using an initializer list)
j["list"] = { 1, 0, 2 };
// add another object (using an initializer list of pairs)
j["object"] = { {"currency", "USD"}, {"value", 42.99} };
// instead, you could also write (which looks very similar to the JSON above)
json j2 = {
{"pi", 3.141},
{"happy", true},
{"name", "Niels"},
{"nothing", nullptr},
{"answer", {
{"everything", 42}
}},
{"list", {1, 0, 2}},
{"object", {
{"currency", "USD"},
{"value", 42.99}
}}
};
请注意,在所有这些情况下,您永远不需要“告诉”编译器您想要使用哪个JSON值类型。如果你想明确或表达一些边缘情况,函数 json::array()
和 json::object()
会有帮助,如下:
// a way to express the empty array []
json empty_array_explicit = json::array();
// ways to express the empty object {}
json empty_object_implicit = json({});
json empty_object_explicit = json::object();
// a way to express an _array_ of key/value pairs [["currency", "USD"], ["value", 42.99]]
json array_not_object = json::array({ {"currency", "USD"}, {"value", 42.99} });
序列化/反序列化
To/from strings 您可以通过添加_json
到一个字符串,来创建一个JSON值(反序列化):
// create object from string literal
json j = "{ \"happy\": true, \"pi\": 3.141 }"_json;
// or even nicer with a raw string literal
auto j2 = R"(
{
"happy": true,
"pi": 3.141
}
)"_json;
请注意,如果不附加_json后缀,传递的字符串文字不会被解析,而只是用作JSON字符串值。也就是说,json j = "{ \"happy\": true, \"pi\": 3.141 }"
只会存储字符串 "{ \"happy\": true, \"pi\": 3.141 }"
,而不是解析实际的对象。
上面的例子也可以用json::parse()
:
// parse explicitly
auto j3 = json::parse("{ \"happy\": true, \"pi\": 3.141 }");
序列化
你也可以得到一个json对象对应的的字符串表达式(序列化):
// explicit conversion to string
std::string s = j.dump(); // {"happy":true,"pi":3.141}
// serialization with pretty printing
// pass in the amount of spaces to indent
std::cout {1, 2, 3, 4}};
json j_array(c_array);
// [1, 2, 3, 4]
std::set{"name", p.name}, {"address", p.address}, {"age", p.age}};
}
void from_json(const json& j, person& p) {
j.at("name").get_to(p.name);
j.at("address").get_to(p.address);
j.at("age").get_to(p.age);
}
} // namespace ns
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?