Boost.JSON 是一个可移植的 C++ 库,它提供了容器和算法来实现 JavaScript 对象表示法,或简称为 “JSON”,一种轻量级数据交换格式。这种格式易于人类阅读和编写,也易于机器解析和生成。它基于 JavaScript 编程语言的子集(ECMA-262 标准),目前在 RFC 8259 中进行了标准化。JSON 是一种文本格式,它与语言无关,但使用的约定对于 C 系列语言(包括 C、C++、C#、Java、JavaScript、Perl、Python 和许多其他语言)的程序员来说是熟悉的。这些属性使 JSON 成为理想的数据交换语言。
该库专注于一个常见且流行的用例:解析和序列化到一个名为 value
的容器,该容器保存 JSON 类型,以及从该容器进行解析和序列化。您构建的任何 value
都可以被序列化和反序列化,保证结果将等于原始值。您使用此库生成的任何 JSON 输出都将被任何语言中最常见的 JSON 实现读取。
value
容器被设计为非常适合作为词汇表类型,适用于公共接口和库中使用,允许它们被组合。该库将可表示的数据类型限制在几乎被大多数 JSON 实现(尤其是 JavaScript)普遍接受的范围内。解析器和序列化器都具有高性能,达到或超过了最佳同类库的基准性能。分配器得到了很好的支持。使用这些类型的代码将易于理解、灵活且高性能。
Boost.JSON 提供以下功能
该库在其接口中严重依赖于以下众所周知的 C++ 类型(以下称为标准类型)
要作为仅标头文件使用;也就是说,要消除将程序链接到静态或动态 Boost.JSON 库的要求,只需在项目中的一个新文件或现有源文件中放置以下行。
#include <boost/json/src.hpp>
MSVC 用户还必须定义宏 BOOST_JSON_NO_LIB
以禁用自动链接。请注意,如果您还想避免链接到 Boost.Container(Boost.JSON 的依赖项),则必须定义 BOOST_CONTAINER_NO_LIB
。为了完全禁用自动链接到 Boost 库,您可以定义 BOOST_ALL_NO_LIB
来代替。
为了支持在禁用异常的情况下进行构建,此库使用了另一个 Boost 库 Boost.ThrowException。这允许自动发现是否支持异常。另一方面,正如 Boost.ThrowException 的文档中所解释的那样,如果禁用异常,则用户需要为 boost::throw_exception
提供他们自己的实现,以便成功链接他们的二进制文件。这是一个非常简单的实现示例
void throw_exception( const std::exception&, const boost::source_location& ) { std::printf("Exceptions are not supported!"); std::abort(); }
Boost.JSON 在嵌入式设备上运行良好。该库使用本地堆栈缓冲区来提高某些操作的性能。在 Intel 平台上,这些缓冲区很大(4KB),而在非 Intel 平台上,它们很小(256 字节)。要调整嵌入式应用程序的堆栈缓冲区大小,请在构建库或包含函数定义时定义此宏
#define BOOST_JSON_STACK_BUFFER_SIZE 1024 #include <boost/json/src.hpp>
Boost.JSON 使用 Boost.Endian 以支持小端和大端平台。
Boost.JSON 已经过以下编译器的测试
该库期望输入文本使用 UTF-8 编码,这是 RFC 对系统之间交换的所有 JSON 提出的要求。同样,该库生成的文本是有效的 UTF-8。
RFC 不允许字节顺序标记 (BOM) 出现在 JSON 文本中,因此该库将 BOM 视为语法错误。
该库支持几个流行的 JSON 扩展。这些必须显式启用。
该库的开发基础设施包括以下每次提交的分析
作为我们致力于生产应用程序开发人员可以信赖的最优秀的 C++ 库的一部分,C++ 联盟委托 Bishop Fox 对 Boost.JSON 库进行安全审计。报告链接在此
C Plus Plus Alliance - Boost JSON 安全评估 2020 - 评估报告 - 20210317
如果没有 Peter Dimov 的设计建议和优化协助,这个库就不会有今天的成就。