C++ JSON库 nlohmann::basic_json::binary_t的用法

简介: C++ JSON库 nlohmann::basic_json::binary_t的用法

简介

nlohmann::basic_json::binary_t 是一个类型别名,用于表示二进制数据。它是 nlohmann::json 库的一部分,这是一个流行的 C++ JSON 处理库。

nlohmann::json 库中,binary_t 是一个类型别名,用于表示二进制数据。具体来说,它是一个 std::vector<uint8_t>,可以用来存储任意的二进制数据。

以下是如何使用 binary_t 的一个简单示例:

#include <nlohmann/json.hpp>
int main() {
    // 创建一个包含二进制数据的 vector
    std::vector<uint8_t> binary_data = {0x01, 0x02, 0x03, 0x04};
    // 创建一个 binary_t 对象
    nlohmann::json::binary_t my_binary(binary_data);
    // 创建一个 JSON 对象并将 binary_t 对象存储在其中
    nlohmann::json j;
    j["my_binary_data"] = my_binary;
    // 输出 JSON 对象
    std::cout << j << std::endl;
    return 0;
}

在这个示例中,我们首先创建了一个包含一些二进制数据的 std::vector<uint8_t>。然后,我们使用这个 vector 创建了一个 binary_t 对象。最后,我们创建了一个 JSON 对象,并将 binary_t 对象存储在其中。

注意,nlohmann::json 库默认情况下不支持二进制数据。要启用对二进制数据的支持,你需要在包含 nlohmann/json.hpp 之前定义 JSON_USE_IMPLICIT_CONVERSIONS 宏,并将其值设置为 0。例如:

#define JSON_USE_IMPLICIT_CONVERSIONS 0
#include <nlohmann/json.hpp>

这将禁用库中的所有隐式转换,包括将 std::vector<uint8_t> 自动转换为 binary_t。然后,你可以显式地创建 binary_t 对象,并将它们存储在 JSON 对象中。

nlohmann::basic_json::binary_t 官网介绍

using binary_t = byte_container_with_subtype<BinaryType>;

这种类型是为了承载出现在各种序列化格式中的二进制数据而设计的,如 CBOR 的 Major Type 2,MessagePack 的 bin,和 BSON 的通用二进制子类型。这种类型不是标准 JSON 的一部分,仅仅是为了与这些二进制类型的兼容性而存在。因此,它只是定义为零个或多个字节值的有序序列。

此外,作为实现细节,二进制数据的子类型作为 std::uint64_t 被携带,这与使用二进制子类型的二进制数据格式兼容(尽管具体的编号与彼此不兼容,用户需要在它们之间进行转换)。子类型通过帮助类型 byte_container_with_subtype 添加到 BinaryType

CBOR’s RFC 7049 描述这种类型为:

Major type 2: a byte string. The string’s length in bytes is represented following the rules for positive integers (major type 0).

MessagePack’s documentation on the bin type family 描述这种类型为:

Bin format family stores a byte array in 2, 3, or 5 bytes of extra bytes in addition to the size of the byte array.

BSON’s specifications 描述了几种二进制类型;然而,这种类型旨在表示通用二进制类型,其描述为:

Generic binary subtype - This is the most commonly used binary subtype and should be the ‘default’ for drivers and tools.

这些都没有对内部表示施加任何限制,除了存储的基本单位是可以分解为字节的某种类型的数组。

这种二进制格式的默认表示是 std::vector<std::uint8_t>,这是在现代 C++ 中表示字节数组的一种非常常见的方式。

模板参数

  • BinaryType:用于存储数组的容器类型

注意事项

默认类型

BinaryType 的默认值是 std::vector<std::uint8_t>

存储

二进制数组在 basic_json 类型中存储为指针。也就是说,对于任何对数组值的访问,必须解引用类型为 binary_t* 的指针。

关于子类型的注意事项

  • CBOR
  • 二进制值表示为字节字符串。子类型被写为标签。
  • MessagePack
  • 如果给定了子类型,并且二进制数组包含恰好 1、2、4、8 或 16 个元素,那么使用 fixext family(fixext1、fixext2、fixext4、fixext8)。对于其他大小,使用 ext family(ext8、ext16、ext32)。
  • BSON
  • 如果给定了子类型,那么它被写为二进制值的子类型。

示例

#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main()
{
    // create binary values
    json::binary_t foo = {1, 2, 3, 4};
    json::binary_t bar = {5, 6, 7, 8};
    // create a JSON array with binary values
    json j = {foo, bar};
    // serialize the JSON array
    std::cout << j << '\n';
    // deserialize the JSON array
    json j2 = json::parse(j.dump());
    // access the binary values
    for (const auto& bin : j2)
    {
        for (uint8_t byte : json::binary_t(bin))
        {
            std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)byte << ' ';
        }
        std::cout << '\n';
    }
}

另请参阅

版本历史

  • 在版本 3.8.0 中添加。

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。

目录
相关文章
|
2月前
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
83 6
|
2月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
125 10
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
86 5
|
2月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
188 0
在Java中处理JSON数据:Jackson与Gson库比较
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
77 1
|
2月前
|
JSON JavaScript 前端开发
JSON.parse()和JSON.stringify()用法
JSON.parse()和JSON.stringify()用法
75 1
|
3月前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
47 6
|
3月前
|
缓存 网络协议 Linux
超级好用的C++实用库之套接字
超级好用的C++实用库之套接字
40 1
|
1月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
52 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
109 5