3个稳定版本
1.0.2 | 2020年11月8日 |
---|---|
1.0.1 | 2020年11月2日 |
1.0.0 | 2020年11月1日 |
#1814 在 编码
每月23次下载
用于 howmuch-rs
30KB
485 行
jsonp
jsonp[ointer] 是一个在Rust中高效解引用嵌套Json结构的库,使用 serde 和 serde_json。
由于我认为它可以作为独立的crate使用,所以我从这个项目中分离了这个库。
许可证
根据您的选择,此库受 Apache许可证第2版 或 MIT许可证 许可。除非您明确表示,否则任何根据Apache-2.0许可证定义的,有意提交给此crate并由您包括的贡献,应如上所述双重许可,不附加任何额外条款或条件。
lib.rs
:
jsonp
快速、零拷贝Json指针。
此库利用 serde 和 serde_json 提供快速、易于使用、按需反序列化Json。
是否曾希望获取一些深层嵌套的数据,而不需要定义所需的Rust结构或多次分配到 serde_json::Value
?没问题
{
"some": {
"deeply": [
{
"nested": {
"truth": "the cake is a lie"
}
}
]
}
}
fn deeply_nested(json: &str) -> Result {
let p = Pointer::default();
let truth: &str = p.dotted(json, ".some.deeply.0.nested.truth")?;
assert_eq!(truth, "the cake is a lie");
Ok(())
}
利用serde的 零拷贝 反序列化,我们 借用 出了底层Json数据中的深层嵌套 truth
。
指针
此库的核心结构是 jsonp::Pointer
。它提供几种方法来解引用Json
尽管 Pointer::with_segments
提供了最大的控制权,以精确地指定每个 Segment
的生成方式,但其他两个 —— Pointer::with_pattern
和 Pointer::dotted
—— 对指针字符串的处理方式做了一些假设。这些是
- 传递空指针(或模式)字符串将默认反序列化整个底层Json。
- 如果指针和模式相等,则与上面相同。
- 以模式开始的指针与不开始的指针等效。例如,
dotted(".foo")
和dotted("foo")
都会导致foo
被解引用。
模式
jsonp::Mode
控制了 jsonp
如何解析指针段。它有两个设置,默认的“延迟”和“早期”。
延迟
在反序列化过程中尝试懒加载地将指针段强制转换为映射键或数组索引。这提供了最大的灵活性,并允许反序列化带有“数字”映射键的映射,例如 "42": "...",但也可能导致期望映射的地方反序列化为数组,反之亦然。
早期
在初始化时决定给定的指针段是数字索引还是字符串键。保证支持 Json 对象与其期望布局一致,否则出错。
辅助工具
此库还提供了一些围绕 jsonp::Pointer
的便利包装结构。如果您打算使用 Pointer
来从单个支持 Json 结构中反复解引用,这些将提供愉快的接口,并减少函数签名中的泛型和生命周期噪音。
依赖关系
~0.5–1MB
~20K SLoC