#serde-json #json-pointer #rfc-6901 #6901

无 std jsonptr

根据JSON指针(RFC 6901)进行解析、分配和删除的数据结构和逻辑

30个版本

0.6.0 2024年8月10日
0.5.1 2024年7月10日
0.4.7 2024年3月18日
0.4.4 2023年10月13日
0.1.5 2022年6月30日

#107编码 中排名

Download history 2848/week @ 2024-05-02 2106/week @ 2024-05-09 3815/week @ 2024-05-16 3689/week @ 2024-05-23 4162/week @ 2024-05-30 4770/week @ 2024-06-06 6731/week @ 2024-06-13 12263/week @ 2024-06-20 12768/week @ 2024-06-27 14761/week @ 2024-07-04 20109/week @ 2024-07-11 23397/week @ 2024-07-18 23137/week @ 2024-07-25 31480/week @ 2024-08-01 116105/week @ 2024-08-08 132287/week @ 2024-08-15

308,354 每月下载量
99 包(6 个直接使用)使用

MIT/Apache

210KB
3.5K SLoC

jsonptr - Rust的JSON指针(RFC 6901)

github crates.io docs.rs build status code coverage

JSON指针(RFC 6901)定义了一种字符串语法,用于标识JSON或类似文档中的特定位置。此包提供了两种类型,PointerPointerBuf(类似于 PathPathBuf),用于抽象地处理它们。

指针由零个或多个 Token 组成,这些是表示对象字段或数组的 index 的单个段,并由单引号或字符串的末尾限定。标记进行了轻度编码,其中 '~' 被转义为 "~0",因为它表示编码,而 '/' 被转义为 "~1",因为 '/' 分隔标记,否则会将标记分割成两部分。

Token 可以通过 Tokens 迭代,后者由指针的 tokens 方法返回,或者通过 Components 迭代,后者由 components 方法返回。区别在于 Tokens 迭代指针中的每个标记,而 Components 迭代 Component,它可以表示文档的根或指针的单个标记。

提供了操作 resolveassigndelete 的特质,它们在指针类型上有对应的方法。为 serde_jsontoml 的值类型的每个特质都提供了实现。所有操作默认启用,但受 功能标志 控制。

使用方法

要从字符串解析 Pointer,可以使用 Pointer::parse 进行可能不可靠的解析,或者使用 from_static 函数从已知的字符串产生一个 &static Pointer

# use jsonptr::Pointer;
let ptr = Pointer::parse("/examples/0/name").unwrap();

let static_ptr = Pointer::from_static("/examples/0/name");
assert_eq!(ptr, static_ptr);

let parent = ptr.parent().unwrap();
assert_eq!(parent, Pointer::parse("/examples/0").unwrap());

let (token, remaining) = ptr.split_front().unwrap();
assert_eq!(token.decoded(), "examples");
assert_eq!(remaining, Pointer::parse("/0/name").unwrap());

PointerBuf 可以通过 PointerBuf::parse 解析,或者通过 from_tokens 方法从 Token 迭代器构建。

# use jsonptr::PointerBuf;
let mut buf = PointerBuf::parse("/examples/0/name").unwrap();

let from_tokens = PointerBuf::from_tokens(["examples", "0", "name"]);
assert_eq!(&buf, &from_tokens);

buf.push_front("pointer");
buf.push_front("~");
buf.push_back("/");
assert_eq!(buf.as_str(), "/~0/pointer/examples/0/name/~1");

迭代指针的标记或组件

# use jsonptr::{Pointer, Component, Token};
let ptr = Pointer::from_static("/path/to/value");

//  Using the `tokens` method:
let tokens: Vec<_> = ptr.tokens().collect();
assert_eq!(tokens, vec![Token::new("path"), Token::new("to"), Token::new("value")]);

// Using the `components` method:
let mut components = ptr.components();
assert_eq!(components.next(), Some(Component::Root));
assert_eq!(components.next(), Some(Component::Token(Token::new("path"))));
assert_eq!(components.next(), Some(Component::Token(Token::new("to"))));
assert_eq!(components.next(), Some(Component::Token(Token::new("value"))));

要获取指针位置的值,可以使用 ResolveResolveMut 特质,或者使用 Pointer::resolvePointer::resolve_mut 方法。更多信息请参阅 resolve 模块。

use jsonptr::Pointer;
use serde_json::json;

let ptr = Pointer::parse("/foo/bar").unwrap();
let data = json!({"foo": { "bar": 34 }});
let bar = ptr.resolve(&data).unwrap();
assert_eq!(bar, &json!(34));

可以使用 Assign 特质或 Pointer::assign 设置值,包括路径扩展。更多信息请参阅 assign

use jsonptr::Pointer;
use serde_json::json;

let ptr = Pointer::parse("/secret/universe").unwrap();
let mut data = json!({"secret": { "universe": 42 }});
let replaced = ptr.assign(&mut data, json!(34)).unwrap();
assert_eq!(replaced, Some(json!(42)));
assert_eq!(data, json!({"secret": { "universe": 34 }}));

可以使用 Delete 特性或 Pointer::delete 方法来删除值。更多信息请参阅 delete

use jsonptr::Pointer;
use serde_json::json;

let ptr = Pointer::parse("/secret/universe").unwrap();
let mut data = json!({"secret": { "universe": 42 }});
let replaced = ptr.assign(&mut data, json!(34)).unwrap();
assert_eq!(replaced, Some(json!(42)));
assert_eq!(data, json!({"secret": { "universe": 34 }}));

功能标志

标志 描述 启用 默认值
"std" 为错误类型实现 std::error::Error
"serde" 启用 serde 对类型的支持
"json" 实现 serde_json::Value 的操作 "serde"
"toml" 实现 toml::Value 的操作 "std", toml
"assign" 启用 assign 模块和相关指针方法,提供了一种在文档中的特定位置分配值的方法
"resolve" 启用 resolve 模块和相关指针方法,提供了一种在文档中的特定位置解析值的方法
"delete" 启用 delete 模块和相关指针方法,提供了一种在文档中的特定位置删除值的方法 "resolve"

许可证

根据以下任一项许可

根据您的方便。

贡献

欢迎并感谢贡献和反馈。如果您发现问题,请提交工单或拉取请求。

除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~110–770KB
~18K SLoC