5 个版本
0.0.5 | 2023 年 1 月 24 日 |
---|---|
0.0.4 | 2022 年 10 月 5 日 |
0.0.3 | 2022 年 10 月 3 日 |
0.0.2 | 2022 年 9 月 16 日 |
0.0.1 | 2022 年 9 月 12 日 |
#2041 在 编码
28KB
585 行
关于此库
此库试图反序列化在 Qt5 内部二进制 JSON 格式中序列化的文件。
我开始这个项目是因为我不知道 QBinaryJson,并认为正在从 Qt5 迁移到 Qt6 且使用此 JSON 文档编码的应用程序将无法读取此文件格式。尽管如此,这个“快乐”的错误让我开始了这个项目,并发现了许多关于 Rust 以及如何从 C++ 代码中使用 Rust 包的知识。
此库试图为 QBinaryJson 提供替代方案。由于 Qt5 的内部二进制 JSON 格式已在 Qt6 中弃用,此库仅处理读取以该格式编码的文件的能力,而不处理以该格式编码文件的能力。
此外,到目前为止,仅支持小端编码的文件。
要反序列化文档,请调用
pub fn deserialize_to_json(qbjs: &[u8]) -> Result<Value, DeserializeError> { ... }
输入参数必须是一个包含整个文件内容的二进制切片(包括包含 qbjs 标签和版本的头部)。该函数的输出是一个 serde_json::Value
或错误,如果反序列化文件时发生错误。
反序列化是如何完成的
反序列化分为两个步骤。
首先,库分析输入切片以确定编码的 JSON 值的类型以及切片中应读取哪些字节索引来解码这些值。这就是 analysis
模块所做的工作。它不读取任何数据,只是尝试找到数据切片索引并将在其输出中翻译 JSON 结构以及切片索引。
其次,一旦分析完成,read
模块简单地尝试将分析步骤的输出转换为实际的 JSON 数据。
文件格式转码能力
Qt5的内部二进制JSON格式被反序列化为一个serde Value。这个serde Value可以被传递给兼容serde的序列化器以转换成其他文件格式(CBOR、YAML等:选择您喜欢的格式)。
测试数据
一些基本的JSON结构已经被编码成qbjs文件,这是通过在utils/json_to_qbjs_converter
中注册的实用程序应用程序作为子模块实现的。生成这些qbjs文件的JSON文件位于tests/test_data/expected_json
文件夹中。这些文件在测试中重复使用:它们被serde_json解析,并比较生成的JSON值与库的输出。
C++ FFI
Qt主要用于C++项目。
如“关于这个库”段落所述,QBinaryJson可用于迁移到Qt6的C++应用程序,并且我强烈建议在生产代码中使用Qt官方的此实现(我相信Qt5处理此二进制JSON格式的源代码被提取到一个专门的兼容性模块中)。
但是,如果您想冒险并在C++代码库中尝试这个Rust crate,我已经制作了这个C++ FFI,它可在这个仓库中找到。它提供了conan软件包和CMake查找器。
依赖项
~3MB
~47K SLoC