8 个版本 (5 个稳定版)
| 1.1.0 | 2021年3月2日 |
|---|---|
| 1.0.3 | 2020年5月11日 |
| 1.0.2 | 2020年4月19日 |
| 1.0.1 | 2020年3月25日 |
| 0.1.2 | 2019年12月29日 |
#168 在 数据结构 中排名
10,526 每月下载量
用于 16 个crate(12 个直接使用)
48KB
1K SLoC
json_dotpath
使用“点路径”访问嵌套JSON数组对象的成员。
变更记录
1.1.0
添加了 dot_has() 和 dot_has_checked()
1.0.3
将 failure 替换为 thiserror,并为错误类型实现 std::error::Error。
1.0.0
API已更改,现在返回 Result<Option<T>> 而不是在内部错误时引发恐慌。现在库的使用更加安全。
此外,所有逻辑都已调整,以使其更加健壮和一致。
数组附加和前缀操作符现在使用 << 和 >> 而不是重载 < 和 >,现在所有数组访问(获取第一个和最后一个元素)的方式都相同。
点路径
点路径表示从JSON对象的根到其节点之一的路径。这样的路径通过点连接对象和数组键来表示
考虑以下示例JSON
{
"fruit": [
{"name": "lemon", "color": "yellow"},
{"name": "apple", "color": "green"},
{"name": "cherry", "color": "red"}
]
}
以下路径表示其部分
""... 整个对象"fruit"... 水果数组"fruit.0"... 第一个水果对象,{"name": "lemon", "color": "yellow"}"fruit.1.name"... 第二个(索引从0开始)水果的名称,"apple"
还可以使用特殊模式进行对象操作(见下文)。
对象操作
DotPaths 特性向 serde_json::Value、Vec<Value> 和 serde_json::Map<String, Value>(Value::Object 和 Value::Array 的内部结构)中添加了五个主要方法。
dot_get(path)- 通过路径获取值dot_get_mut(path)- 获取JSON对象的元素的可变引用dot_set(path, value)- 设置新值,丢弃原始值(如果有)dot_replace(path, value)- 设置新值,返回原始值(如果有)dot_take(path)- 通过路径删除值,返回它(如果有)
dot_set() 支持其他方法中找不到的数组操作语法,即使用 >n 和 <n 模式在索引之前或之后插入元素,并移动其余 Vec
附加方便的方法
dot_remove(path)- 通过路径删除值dot_get_or(path, def)- 获取值,或自定义默认值dot_get_or_default(path)- 获取值,或Default::default()dot_has_checked(path)- 检查路径是否有效并且存在值dot_has(path)- 与上面相同,但错误静默变为false
所有方法都是通用的,负责序列化和反序列化存储/检索的数据。《tt class="src-rs">dot_get_mut()是一个例外,返回&mut Value。
dot_set()和dot_remove()不反序列化原始对象,这使得它们在原始值不需要时比dot_replace()和dot_take()更高效。
错误报告
所有方法都返回Result<json_dotpath::Error, T>(别名json_dotpath::Result<T>),无论是作为json_dotpath::Result<()>,还是当期望一个值时,作为json_dotpath::Result<Option<T>>。
应谨慎处理这些结果,因为它们报告结构错误(意味着请求的操作无法执行),或提供的路径无效。
动态对象构建
当路径不存在但可以存在(例如附加的数组元素、新的对象键),并且使用了其中一个赋值方法或dot_get_mut()时,将自动创建此元素,包括所需的父元素。
这在某个单元测试中得到了很好的说明
let mut obj = Value::Null;
let _ = obj.dot_get_mut("foo.0").unwrap(); // get mut, here only for side effects
assert_eq!(json!({"foo": [null]}), obj);
在这种情况下,null可以灵活地变成数组或对象(见下文“null的特殊处理”)。
点路径语法
路径简单地是一系列由点(.)连接的路径段。
根据它们使用的方法,库为一些符号赋予了特殊的意义。所有符号(包括.)都可以使用反斜杠转义,如果它们的字面值需要作为路径的一部分。
数组模式
数组键必须是数字(整数),或者以下列出的特殊模式之一。
<... 第一个元素>... 最后一个元素-或<<... 预先添加+或>>... 追加<n,例如<5... 在第n个元素之前插入>n,例如>5... 在第n个元素之后插入
通过设置不存在的路径,可以在保持键语法规则的情况下创建嵌套数组或对象。
请参阅单元测试以获取更多示例。
Null的特殊处理
JSON中的null可以通过设置其成员(即使是嵌套的)透明地变成数组或对象,就像它是空数组或对象一样。它应该变成数组还是对象取决于用来索引它的键。
- 数字键将null转换为数组(只有
0和特殊的数组运算符被允许,因为其他数字对于空数组来说是超出范围的) - 任何其他键将其转换为映射
- 任何以转义符开始的键也会创建映射(例如,
\0.aaa将null转换为{"0": {"aaa": …} })
当检索时,JSON中的null被视为空值,并转换为 Ok(None),因为它不能反序列化。
将值设置为 Value::Null 会按预期工作,并在对象中放置一个JSON null,当获取可变引用时也是如此。
依赖项
~0.6–1.4MB
~31K SLoC