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 在 编码 中排名
308,354 每月下载量
被 99 个 包(6 个直接使用)使用
210KB
3.5K SLoC
jsonptr - Rust的JSON指针(RFC 6901)
JSON指针(RFC 6901)定义了一种字符串语法,用于标识JSON或类似文档中的特定位置。此包提供了两种类型,Pointer
和 PointerBuf
(类似于 Path
和 PathBuf
),用于抽象地处理它们。
指针由零个或多个 Token
组成,这些是表示对象字段或数组的 index
的单个段,并由单引号或字符串的末尾限定。标记进行了轻度编码,其中 '~'
被转义为 "~0"
,因为它表示编码,而 '/'
被转义为 "~1"
,因为 '/'
分隔标记,否则会将标记分割成两部分。
Token 可以通过 Tokens 迭代,后者由指针的 tokens 方法返回,或者通过 Components 迭代,后者由 components 方法返回。区别在于 Tokens 迭代指针中的每个标记,而 Components 迭代 Component,它可以表示文档的根或指针的单个标记。
提供了操作 resolve、assign 和 delete 的特质,它们在指针类型上有对应的方法。为 serde_json 和 toml 的值类型的每个特质都提供了实现。所有操作默认启用,但受 功能标志 控制。
使用方法
要从字符串解析 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"))));
要获取指针位置的值,可以使用 Resolve 和 ResolveMut 特质,或者使用 Pointer::resolve 和 Pointer::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 License, Version 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
根据您的方便。
贡献
欢迎并感谢贡献和反馈。如果您发现问题,请提交工单或拉取请求。
除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~110–770KB
~18K SLoC