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 在 解析器实现
每月431次下载
用于 3 个crate(通过 kludgine)
190KB
4.5K SLoC
justjson
为Rust提供高效的JSON Value
crate。
此crate经过彻底测试,但仍处于开发初期。欢迎提供反馈。
为什么还需要另一个JSON库?
此库适用于以下开发者
- 正在处理JSON,但既不想使用也不可以使用
serde
。 - 希望以最小分配从切片中解析JSON值。
如果以上任一情况不适用于您,您应认真考虑使用 serde
和 serde-json
或 simd-json
。
这个用例适用于哪些实际场景?解析 JSON-LD压缩文档格式 需要检查JSON以找到 @context
字段,并使用 @context
字段中的信息来解释文档的其余部分。这种JSON-LD表示形式被 ActivityPub 使用,这是一个支持 Fediverse 的协议。
JustJson有哪些有趣之处?
JustJson的最佳使用场景是解析&str
或&[u8]
。解析这两种类型之一时,返回的Value
类型是Value<&str>
。所有字符串和数字都保留在JsonString
和JsonNumber
类型中的原始形式。虽然它们保留了原始形式,但在解析时进行全面验证。结果是解析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。