5 个版本
0.8.1 | 2022年4月5日 |
---|---|
0.8.0 | 2021年5月14日 |
0.7.5 | 2021年4月19日 |
0.7.1 | 2021年3月29日 |
0.1.2 |
|
298 在 解析器实现
5,794 每月下载量
在 20 个 包(19 个直接)中使用
3MB
3.5K SLoC
快速获取 JSON 值
GJSON 是一个 Rust 包,它提供了一种快速且简单的方法来从 JSON 文档中获取值。它具有以下功能:单行检索、点符号路径、迭代以及解析 JSON 行。
此库使用的路径语法与 Go 版本 相同。
入门
用法
在您的 Cargo.toml 中添加以下内容
[dependencies]
gjson = "0.8"
获取值
获取会搜索 JSON 以找到指定的路径。路径采用点符号,例如 "name.last" 或 "age"。找到值后立即返回。
const JSON: &str = r#"{"name":{"first":"Janet","last":"Prichard"},"age":47}"#;
fn main() {
let value = gjson::get(JSON, "name.last");
println!("{}", value);
}
这将打印
Prichard
路径语法
以下是对路径语法的简要概述,更完整的信息请参阅 GJSON 语法。
路径是一系列由点分隔的键。键可能包含特殊通配符 '*' 和 '?'。要访问数组值,请使用索引作为键。要获取数组中的元素数量或访问子路径,请使用 '#' 字符。点和通配符可以用 '\' 转义。
{
"name": {"first": "Tom", "last": "Anderson"},
"age":37,
"children": ["Sara","Alex","Jack"],
"fav.movie": "Deer Hunter",
"friends": [
{"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
{"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
{"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
]
}
"name.last" >> "Anderson"
"age" >> 37
"children" >> ["Sara","Alex","Jack"]
"children.#" >> 3
"children.1" >> "Alex"
"child*.2" >> "Jack"
"c?ildren.0" >> "Sara"
"fav\.movie" >> "Deer Hunter"
"friends.#.first" >> ["Dale","Roger","Jane"]
"friends.1.last" >> "Craig"
您还可以使用 #(...)
查询数组以获取第一个匹配项,或使用 #(...)#
查询所有匹配项。查询支持 ==
、!=
、<
、<=
、>
、>=
比较运算符以及简单的模式匹配 %(如)和
!%(不似)运算符。
friends.#(last=="Murphy").first >> "Dale"
friends.#(last=="Murphy")#.first >> ["Dale","Jane"]
friends.#(age>45)#.last >> ["Craig","Murphy"]
friends.#(first%"D*").last >> "Murphy"
friends.#(first!%"D*").last >> "Craig"
friends.#(nets.#(=="fb"))#.first >> ["Dale","Roger"]
值类型
将 JSON 值转换为 Rust 类型
value.i8()
value.i16()
value.i32()
value.i64()
value.u8()
value.u16()
value.u32()
value.u64()
value.f32()
value.f64()
value.bool()
value.str() // a string representation
value.json() // the raw json
在值上工作的实用函数
value.kind() // String, Number, True, False, Null, Array, or Object
value.exists() // returns true if value exists in JSON.
value.get(path: &str) // get a child value
value.each(|key, value|) // iterate over child values
64 位整数
调用 value.i64()
和 value.u64()
可读取所有 64 位,从而支持大 JSON 整数。
value.i64() -> i64 // -9223372036854775808 to 9223372036854775807
value.u64() -> u64 // 0 to 18446744073709551615
修饰符和路径链式调用
修饰符是执行自定义处理的 JSON 路径组件。
可以使用管道字符将多个路径“链式”连接起来。这对于从修改后的查询中获取值很有用。
例如,使用上述 JSON 文档的内置 @reverse
修饰符,我们将获取 children
数组并反转其顺序
"children|@reverse" >> ["Jack","Alex","Sara"]
"children|@reverse|0" >> "Jack"
目前有以下内置修饰符
@reverse
:反转数组或对象的成员。@ugly
:从 JSON 文档中移除所有空白。@pretty
:使 JSON 文档更易于阅读。@this
:返回当前元素。它可以用来检索根元素。@valid
:确保 JSON 文档有效。@flatten
:扁平化数组。@join
:将多个对象合并为单个对象。
修饰符参数
修饰符可能接受一个可选参数。参数可以是有效的 JSON 文档或字符。
例如,@pretty
修饰符接受一个 JSON 对象作为其参数。
@pretty:{"sortKeys":true}
这将使 JSON 更美观并对其所有键进行排序。
{
"age":37,
"children": ["Sara","Alex","Jack"],
"fav.movie": "Deer Hunter",
"friends": [
{"age": 44, "first": "Dale", "last": "Murphy"},
{"age": 68, "first": "Roger", "last": "Craig"},
{"age": 47, "first": "Jane", "last": "Murphy"}
],
"name": {"first": "Tom", "last": "Anderson"}
}
@pretty
的完整选项列表是 sortKeys
、indent
、prefix
和 width
。有关更多信息,请参阅 Pretty Options。
JSON 行
支持使用 ..
前缀进行 JSON Lines,该前缀将多行文档视为一个数组。
例如
{"name": "Gilbert", "age": 61}
{"name": "Alexa", "age": 34}
{"name": "May", "age": 57}
{"name": "Deloise", "age": 44}
..# >> 4
..1 >> {"name": "Alexa", "age": 34}
..3 >> {"name": "Deloise", "age": 44}
..#.name >> ["Gilbert","Alexa","May","Deloise"]
..#(name="May").age >> 57
获取嵌套数组值
假设您想要获取以下 JSON 中的所有姓氏
{
"programmers": [
{
"firstName": "Janet",
"lastName": "McLaughlin",
}, {
"firstName": "Elliotte",
"lastName": "Hunter",
}, {
"firstName": "Jason",
"lastName": "Harold",
}
]
}
您将使用路径 "programmers.#.lastName" 如此使用
value := gjson::get(json, "programmers.#.lastName");
for name in value.array() {
println!("{}", name);
}
您也可以查询数组中的对象
let name = gjson::get(json, "programmers.#(lastName=Hunter).firstName");
println!("{}", name) // prints "Elliotte"
迭代对象或数组
ForEach
函数允许快速迭代对象或数组。对于对象,键和值传递给迭代函数。对于数组,只传递值。从迭代器函数返回 false
将停止迭代。
let value := gjson::get(json, "programmers")
value::each(|key, value| {
println!("{}", value);
true // keep iterating
});
简单解析和获取
存在一个 gjson::parse(json)
函数,它将执行简单解析,以及一个 value.get(path)
,它将搜索值。
例如,所有这些都将返回相同的价值
gjson::parse(json).get("name").get("last");
gjson::get(json, "name").get("last");
gjson::get(json, "name.last");
检查值是否存在
有时你只是想知道值是否存在。
let value = gjson::get(json, "name.last");
if !value.exists() {
println!("no last name");
} else {
println!("{}", value);
}
// Or as one step
if gjson::get(json, "name.last").exists() {
println!("has a last name");
}
验证 JSON
Get*
和 Parse*
函数期望 JSON 是有效的。无效的 JSON 不会引发恐慌,但它可能返回意外的值。
如果您正在从不可预测的来源消费JSON,那么在使用GJSON之前进行验证可能是个好主意。
if !gjson::valid(json) {
return Err("invalid json");
}
let value = gjson::get(json, "name.last");