1 个不稳定版本
0.1.0 | 2023年4月19日 |
---|
#2621 in 解析器实现
41KB
600 行
Json 指针和操作符重载
概述
虽然使用 serde
包来序列化和反序列化 json 之间的本地 rust 类型是非常棒的,但仍有一些情况需要直接使用无类型 json 树,可能是因为 json 树过于自由或过于松散,无法很好地映射到某些强类型,例如 json 模式结构,或其他任何原因。
这个包专注于操作 json 树中的单个节点,基于 json 指针,主要遵循标准的 json 指针语法,并通过操作符重载使其更方便、更直观。
- 使用
path()
或path_mut()
方法创建 json 指针或可变指针,我们需要新类型来支持操作符重载。 - 使用路径操作符
/
指向更深的子节点。 - 使用管道操作符
|
从指向的节点读取标量原始值,可能最终完成/
操作符链,这将被读取为get_or
。 - 使用操作符
<<
向节点添加新标量值,或将更多项目推送到数组或对象节点。 - 还重载了操作符
*
等,因此指针可以隐式用作Opion<&Value>
。
依赖项
serde_json
,json 指针指向serde_json::Value
。toml
,如果启用toml
功能,因为 toml 的数据结构与 json 非常相似。
扩展
json 或 toml 指针实际上是更通用 Value
指针的具体类型。因此,可以实现对其他类似 json 的数据结构的指针和操作符重载,或者对以树结构组织的一般值节点实现以下特性
ValuePath
,用于操作符/
;ValueReader
,用于操作符|
;ValueWriter
,用于操作符<<
。
如果您从头开始自行实现一些Value
结构体,那么可以直接对&Value
进行操作符重载,无需使用path()
方法来开始一个/
操作符链。
示例视图
let v: Value = "{...}".parse().unwrap(); # got a Value tree from anywhere
let node = v.path() / "sub" / 0 / "subdeep";
let node = v.path() / "sub/0/subdeep";
let node = v.pathto("sub/0/subdeep");
let scalar = node | 0;
let scalar = v.path() / "path" / "to" / "string-node" | "";
let mut v: Value = ...;
let _ = v.path_mut() / "path" / "to" / "leaf" << "some new value";
let _ = v.path_mut() / "path" / "to" / "object" << ("key", "val") << ("k2", "v2");
let _ = v.path_mut() / "path" / "to" / "array" << ("val",) << ["v2"];
请参阅文档以获取更多详细且可运行的示例和测试。
依赖项
~0.5–1MB
~21K SLoC