#json-format #json #deserialize-json #binary-format #deserialize #binary #qt5

qbjs_deserializer

此包尝试将使用 Qt5 内部二进制 JSON 格式序列化的文件反序列化成 serde_json 值

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编码

MIT 许可证

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