#json-toml #json #operator #toml

json_ops

根据 json 指针语法实现,返回类型为 Option<&toml::Value>。重载 / 作为路径操作符,以指向 json 树中的节点,以及一些其他有意义的操作符重载

1 个不稳定版本

0.1.0 2023年4月19日

#2621 in 解析器实现

MIT/Apache

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