看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!
JSON for Modern C++ 3.1 版本增加了对 Universal Binary JSON(UBJSON)规范和 JSON 合并补丁(Merge Patch)的支持。
UBJSON 是支持 Modern C++ 几种格式之一,它可以减少编码值的大小,加快解码速度。除了 UBJSON, CBOR 和 MessagePack 也同样支持 Modern C++。 每种格式都有不同的优势,选择哪种格式取决于你所需要的数据类型。在这三种格式中,UBJSON 是唯一完整二进制格式的,这就意味着所有的 JSON 值都可以转换成 UBJSON,并且所有的 UBJSON 值也都能转换成 JSON。
JSON 合并补丁格式的作用是声明两个 JSON 文档之间的差异。这种格式是与 HTTP PATCH 一起使用的,它能够对资源进行部分更新,而 HTTP PUT 则用于对资源进行完全替换。JSON 合并补丁允许你只对 JSON 的一部分进行定义,并且将其合并到服务器端。这比使用基本的 JSON 补丁格式更加方便,基本的 JSON 补丁格式依赖于一组操作的规范来对原始的 JSON 文档进行修补。例如:
// a JSON value
json j_document = R"({
"a": "b",
"c": {
"d": "e",
"f": "g"
}
})"_json;
// a JSON patch (RFC 6902)
json j_patch_1 = R"([
{ "op": "replace", "path": "/a", "value": "z" },
{ "op": "remove", "path": "/f"}
])"_json;
// a JSON Merge patch (RFC 7386)
json j_patch_2 = R"({
"a":"z",
"c": {
"f": null
}
})"_json;
JSON for Modern C++ 库旨在提供一种直观的语法来对 JSON 数据进行处理,就好像该 JSON 数据是头等(first-class)数据类型一样。例如,你能通过以下语句来对一个对象进行初始化:
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 代码后边来对 JSON 代码进行解码:
auto j2 = R"(
{
"happy": true,
"pi": 3.141
}
)"_json;
JSON for Modern C++ 另外的优点是易于集成,这要归功于它可以被封装于一个单独的头文件json.hpp中,而不需要任何外部库或依赖项。除此之外,它还声称能够通过 100% 的代码覆盖单元测试,并且不存在内存泄漏。




