1个不稳定版本
使用旧的Rust 2015
0.0.1 | 2015年4月11日 |
---|
#33 in #json-query
用于 mbutiles
31KB
772 行
rust-jlens
Rust的简单JSON查询DSL
lib.rs
:
从JSON中提取数据
此crate提供了一个基于方法链的简单领域特定语言,用于构建和运行针对serialize::json::Json
对象的查询。
实现Selector
特质的对象描述了从JSON文档中的给定路径开始选择节点集的方法。最基础的选择器可以通过node()
函数创建:此选择器始终选择它接收到的确切路径。所有选择器都有返回新选择器的child()
和key()
等方法。新选择器将根据某些标准相对于原始选择器的输出选择节点。例如,node().child()
选择初始节点的所有子节点,而node().child().child()
则选择初始节点子节点的所有子节点,依此类推。通过这种方式继续链式调用方法,可以构建表示复杂查询表达式的选择器对象。示例
// Test JSON document
let json = r#"
[
{
"foo": ["Hello, world!", 3.14, false]
},
{
"foo": [42, true]
},
{
"foo": "Nope"
},
{
"bar": [42, "Hello, world!"]
}
]"#.parse::<Json>().unwrap();
// Given a list, match all objects in it that
// have a "foo" key where the value is a list
// that contains either the string "Hello, world!"
// or the u64 42
let matches = json.query(
list().child().wherein(
key("foo").list().child().or(
string().equals("Hello, world!"),
uint64().equals(42))));
// Expected matches
let match1 = r#"{"foo": ["Hello, world!", 3.14, false]}"#.parse::<Json>().unwrap();
let match2 = r#"{"foo": [42, true]}"#.parse::<Json>().unwrap();
assert_eq!(matches.len(), 2);
assert!(matches.contains(& &match1));
assert!(matches.contains(& &match2));
JsonExt
特质为Json
对象提供了一种便利方法,该方法运行选择器并返回一个Vec<&Json>
的结果。
依赖项
~225KB