#pointers #json #simd #parser #rfc #values #simd-json

json-pointer-simd

这是一个用于解析和使用 JSON 指针的 crate,根据 RFC 6901 规范

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 次下载

MIT 许可证

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_jsonpointer 方法不同,它处理在使用前验证 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