#json-parser #json #borrowing #parse-json #data #document

无需std justjson

一个高效的允许借用数据的JSON值crate。

6个版本

0.3.0 2023年12月8日
0.2.3 2023年4月11日
0.2.2 2023年2月2日
0.2.1 2023年1月25日
0.1.1 2023年1月20日

#704解析器实现

Download history 41/week @ 2024-03-13 35/week @ 2024-03-20 24/week @ 2024-03-27 86/week @ 2024-04-03 26/week @ 2024-04-10 28/week @ 2024-04-17 20/week @ 2024-04-24 46/week @ 2024-05-01 219/week @ 2024-05-08 68/week @ 2024-05-15 42/week @ 2024-05-22 43/week @ 2024-05-29 52/week @ 2024-06-05 60/week @ 2024-06-12 272/week @ 2024-06-19 42/week @ 2024-06-26

每月431次下载
用于 3 个crate(通过 kludgine

MIT/Apache

190KB
4.5K SLoC

justjson

crate version Live Build Status HTML Coverage Report for main branch Documentation

为Rust提供高效的JSON Value crate。

此crate经过彻底测试,但仍处于开发初期。欢迎提供反馈。

为什么还需要另一个JSON库?

此库适用于以下开发者

  • 正在处理JSON,但既不想使用也不可以使用 serde
  • 希望以最小分配从切片中解析JSON值。

如果以上任一情况不适用于您,您应认真考虑使用 serdeserde-jsonsimd-json

这个用例适用于哪些实际场景?解析 JSON-LD压缩文档格式 需要检查JSON以找到 @context 字段,并使用 @context 字段中的信息来解释文档的其余部分。这种JSON-LD表示形式被 ActivityPub 使用,这是一个支持 Fediverse 的协议。

JustJson有哪些有趣之处?

JustJson的最佳使用场景是解析&str&[u8]。解析这两种类型之一时,返回的Value类型是Value<&str>。所有字符串和数字都保留在JsonStringJsonNumber类型中的原始形式。虽然它们保留了原始形式,但在解析时进行全面验证。结果是解析JSON值时分配的内存显著减少。

JsonString实现了PartialEq<&str>/PartialCmp<&str>,这样如果JsonString包含转义序列,比较将得到正确处理。每个JsonString都跟踪其解码长度以及是否存在转义,使得这种比较非常高效。

let json = justjson::JsonString::from_json("\"Hello, World!\"").unwrap();
assert_eq!(json, "Hello, World!");

JustJson还提供了一种更快的解析方法:Document。当将数组或对象解析到Value时,解析器不知道每个数组或对象的大小,直到解析对象的其余部分。Document通过单个Vec构建表示JSON值的树,进一步减少了解析文档时所需的分配数量。

这种额外的速度是以需要迭代来检查Document的API为代价的。

基准测试

您可以通过执行以下命令来运行基准测试:RUSTFLAGS="-C target-cpu=native" cargo bench -p benchmarks --all-features。目前只有一个基准测试,测试了小JSON负载的漂亮和紧凑表示。

small-pretty/justjson/str
                        time:   [802.34 ns 804.91 ns 807.35 ns]
small-pretty/justjson/doc/str
                        time:   [603.15 ns 607.13 ns 611.21 ns]
small-pretty/justjson/bytes
                        time:   [774.45 ns 775.84 ns 777.37 ns]
small-pretty/justjson/doc/bytes
                        time:   [688.51 ns 696.55 ns 705.09 ns]
small-pretty/serde-json/str
                        time:   [860.82 ns 862.12 ns 863.43 ns]
small-pretty/serde-json/bytes
                        time:   [917.49 ns 920.17 ns 923.26 ns]
small-pretty/simd-json/bytes
                        time:   [702.67 ns 704.71 ns 706.61 ns]
small-pretty/json-deserializer/bytes
                        time:   [858.81 ns 861.37 ns 864.88 ns]

small/justjson/str      time:   [736.80 ns 739.94 ns 743.56 ns]
small/justjson/doc/str  time:   [611.54 ns 618.64 ns 625.15 ns]
small/justjson/bytes    time:   [710.26 ns 711.53 ns 712.86 ns]
small/justjson/doc/bytes
                        time:   [588.97 ns 594.66 ns 600.98 ns]
small/serde-json/str    time:   [831.89 ns 833.17 ns 834.69 ns]
small/serde-json/bytes  time:   [874.84 ns 876.26 ns 877.90 ns]
small/simd-json/bytes   time:   [690.41 ns 691.48 ns 692.79 ns]
small/json-deserializer/bytes
                        time:   [778.87 ns 779.85 ns 780.85 ns]

不安全代码的使用

此crate仅在从原始传入数据转换为UTF-8数据时使用不安全代码。在调用这些函数之前,解析器将完全验证数据是否有效UTF-8。

no_std支持

默认情况下,此crate启用std功能,它添加了对Rust标准库类型的支持。通过禁用默认功能,此crate可用于no_std项目。例如,在您的Cargo.toml中

[dependencies]
justjson = { version = "*", default-features = false }

Value类型需要启用alloc功能。

Document类型别名需要启用alloc功能,但GenericDocument类型允许您提供自己的收集类型。

启用 heapless 功能后,可以使用 HeaplessDocument 类型,通过 heapless crate 的 Vec 类型进行存储,来解析文档。这允许在不支持 alloc crate 的环境中解析 JSON。

开源许可证

本项目,如同 Khonsu Labs 的所有项目一样,是开源的。本存储库在 MIT 许可证Apache License 2.0 下可用。

要了解更多关于贡献的信息,请参阅 CONTRIBUTING.md

依赖项