4 个版本 (2 个破坏性更新)
0.3.1 | 2023 年 12 月 22 日 |
---|---|
0.3.0 | 2023 年 12 月 22 日 |
0.2.0 | 2023 年 12 月 22 日 |
0.1.0 | 2023 年 12 月 21 日 |
#45 在 #rfc
每月 49 次下载
29KB
452 行
json-pointer
序言
此 crate 是对 json-pointer crate 的泛化。
它将 JSON 指针的目标扩展到任何可以使用 JsonPointerTarget
特性适配的对象。crate 的奇怪名称 (.simd) 来自其第一个用例和第一个实现尝试——
- 使用 simd-json 值来使用 JSON 指针。
但在这个过程中,以及 JsonPointerTarget
特性的回实现中,很快就可以明显地重新包含 [serde_json] 值!
因此,这个 crate 是一个临时的解决方案,希望在将来某个时候将其合并回 json-pointer
。在此之前还有很多工作要做——功能、测试、文档、更好的语义...
除了与 JsonPointerTarget
相关的重构之外,我还对代码进行了一些更新,以使用 Rust 2021 的语义。
除此之外,所有代码、示例和测试都是原始作者的。
阅读我
这是一个根据 RFC 6901 规范解析和使用 JSON 指针的 crate。与内置于 serde_json
的 pointer
方法不同,它处理在使用前验证 JSON 指针和 URI 片段标识符表示。
创建 JSON 指针
JSON 指针可以使用字面量 [&str]
创建,或从 String
解析。
let from_strs = JsonPointer::new([
"foo",
"bar",
]);
let parsed = "/foo/bar".parse::<JsonPointer<_, _>>().unwrap();
let from_dotted_notation = JsonPointer::new("foo.bar".split('.').collect::<Vec<&str>>());
assert_eq!(from_strs.to_string(), parsed.to_string());
使用 JSON 指针
《JsonPointer》类型提供了.get()
和.get_mut()
方法,分别用于获取适当值的引用和可变引用。
let ptr = "/foo/bar".parse::<JsonPointer<_, _>>().unwrap();
let document = json!({
"foo": {
"bar": 0,
"baz": 1,
},
"quux": "xyzzy"
});
let indexed = document.get(&ptr).unwrap();
assert_eq!(indexed, &json!(0));
URI片段标识表示
JSON指针可以嵌入URI的片段部分。这就是为什么大多数JSON指针库在JSON指针的开头都需要一个#
字符。该库将检测到前面的#
字符作为解析URI片段标识表示的指示。请注意,这意味着该库不支持解析完整的URI。
let str_ptr = "/f%o".parse::<JsonPointer<_, _>>().unwrap();
let uri_ptr = "#/f%25o".parse::<JsonPointer<_, _>>().unwrap();
assert_eq!(str_ptr, uri_ptr);
依赖项
~6.5MB
~116K SLoC