概述
Boost.JSON 是一个可移植的 C++ 库,它提供了实现 JavaScript Object Notation(简称 "JSON")的容器和算法。JSON 是一种轻量级的数据交换格式。这种格式易于人类阅读和编写,也易于机器解析和生成。它基于 JavaScript 编程语言的一个子集(Standard 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++11
-
快速流式解析器和序列化器
-
对象的常量时间键查找
-
允许非标准 JSON 的选项
-
支持分配器的简单安全的现代 API
-
可选的仅头文件,无需链接库
要求
该库在其接口中严重依赖这些知名的 C++ 类型(以下简称标准类型)
-
string_view -
memory_resource,polymorphic_allocator -
error_category,error_code,error_condition,system_error
仅头文件
要用作仅头文件,即无需链接程序到静态或动态 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 已与以下编译器进行了测试
-
clang: 3.5, 3.6, 3.7, 3.8, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
-
gcc: 5, 6, 7, 8, 9, 10, 11, 12
-
msvc: 14.0, 14.1, 14.2, 14.3
支持的 JSON 文本
该库期望输入文本使用 UTF-8 编码,这是系统间交换的所有 JSON 都需要遵循的(RFC)要求。同样,该库生成的文本也是有效的 UTF-8。
RFC 不允许在 JSON 文本中出现字节顺序标记 (BOM),因此该库将 BOM 视为语法错误。
该库支持一些流行的 JSON 扩展。这些需要显式启用。
质量保证
该库的开发基础设施包括以下提交即分析:
-
覆盖率报告
-
基准性能比较
-
在 Drone.io, Azure Pipelines, Appveyor 上进行编译和测试
-
使用 clang-llvm 和机器学习进行模糊测试
安全审查 (Bishop Fox)
作为我们致力于为应用程序开发者提供最可靠的 C 库的承诺的一部分,C Alliance 已委托 Bishop Fox 对 Boost.JSON 库进行安全审计。报告链接在此
C Plus Plus Alliance - Boost JSON Security Assessment 2020 - Assessment Report - 20210317
鸣谢
如果没有 Peter Dimov 在设计建议和优化方面的帮助,这个库就不会有今天的成就。