您当前的位置: 首页 >  json

顺其自然~

暂无认证

  • 3浏览

    0关注

    1317博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

json解析之C++库nlohmann / json

顺其自然~ 发布时间:2021-11-02 08:59:33 ,浏览量:3

项目地址: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支持来加快开发速度,那么这个库就是您的不二之选。

Integration

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作为一级数据类型

这里有一些例子可以让你知道如何使用这个类。

假设您想要用此库创建这样的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
            
关注
打赏
1662339380
查看更多评论
0.0502s