Boost C++ 库

……是世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

Boost.JSON - Boost C++ 函数库

概述

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++11

  • 链接到已构建的静态或动态 Boost 库(构建说明 此处 可找到),或使用头文件(如下文所述)

  • 可能需要额外的链接到 Boost.Container(如其 文档中所述)

  • 支持 -fno-exceptions,自动检测(但请阅读此页面上的 相关部分)。

本库在其接口中(以下称为*标准类型*)大量依赖于这些知名的 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 编码,这是由(RFC)对所有系统间交换的 JSON 提出的要求。同样,本库生成的文本也是有效的 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 在设计建议和优化方面的帮助,本库就不会有今天的成就。