1个不稳定版本

使用旧的Rust 2015

0.0.1 2015年4月11日

#33 in #json-query


用于 mbutiles

BSD-2-Clause

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