2 个版本
0.1.1 | 2023年2月26日 |
---|---|
0.1.0 | 2023年2月26日 |
在 解析器实现 中排名第 2532
24KB
506 行
概述
serde_filter
是一个库包,它通过使用 serde
作为后端,为 JSON 对象和数组提供过滤抽象。它允许您通过提供一组可配置的过滤器,轻松地过滤和转换复杂的 JSON 结构。
该库提供了一系列开箱即用的过滤器,用于常见的用例,例如根据键或值进行过滤、展开嵌套对象和数组等。您也可以通过实现 Filter
特性来自定义过滤器。
使用预构建的过滤器
let condensed = filter::<Flatten>(json.clone(), &Flatten::new('.'))?;
let trimmed = filter::<Ignore>(json.clone(), &Ignore::new(vec!["explanation", "media_type"]))?;
let nums = filter::<Match<u64>>(json.clone(), &Match::new("activeRegionNum"))?;
基于键匹配
匹配过滤器允许您通过匹配特定键来过滤 JSON 对象。您可以使用它来检索具有特定键的嵌套对象中的所有值,或者检索与给定键相关联的特定值。
let json = json!({
"Object": {
"explanation": "test explanation",
"activeRegionNum": 23
},
"2022-01-11": {
"Object2": {
"explanation": "none",
"activeRegionNum": 98
}
}
});
let nums = filter::<Match<u64>>(json, &Match::new("activeRegionNum")).unwrap();
assert_eq!(vec![23 as u64, 98 as u64], nums);
展开嵌套结构
example/flatten.rs
展示了如何使用 Flatten 过滤器来展开嵌套的 JSON 对象
let json = json!({
"name": "John Smith",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA"
}
});
let flattened = filter::<Flatten>(json, &Flattener::default())?;
assert_eq!(flattened, json!({
"name": "John Smith",
"age": 30,
"address.street": "123 Main St",
"address.city": "Anytown",
"address.state": "CA"
}));
忽略键
忽略过滤器允许您从 JSON 对象中删除特定的键。这在您想从响应中排除某些字段或匿名化敏感数据时非常有用。
let json = json!({
"2020-01-01": {
"explanation": "test_1",
"media_type": "test",
"hdurl": "test",
"service_version": "test",
"code": 200,
"msg": "test"
},
"Object": {
"2023-01-11": {
"Object": {
"explanation": "test_3",
"media_type": "test",
"hdurl": "test",
"service_version": "test",
"code": 200,
"msg": "test"
},
"explanation": "test_2",
}
},
"explanation": "test_0"
});
let ignore = Ignore::new(vec!["explanation"]);
let trimmed = filter::<Ignore>(json, &ignore).unwrap();
assert!(trimmed["2020-01-01"].get("explanation").is_none(), "test_1");
assert!(
trimmed["Object"]["2023-01-11"]["Object"]
.get("explanation")
.is_none(),
"test_3"
);
assert!(
trimmed["Object"]["2023-01-11"].get("explanation").is_none(),
"test_2"
);
assert!(trimmed.get("explanation").is_none(), "test_0");
更多示例
该存储库的 examples 目录包含更多示例,展示了如何使用 serde_filter 提供的各种过滤器。
实验性和不稳定
请注意,serde_filter 目前是一个实验性库,仍然处于早期开发阶段。虽然我们已经尽最大努力确保库的功能和正确性,但它还不稳定,未来版本可能会进行破坏性更改。
我们欢迎社区提供反馈、错误报告和贡献,以帮助改进库并使其对每个人更有用。但是,请了解,您使用此库编写的任何代码可能需要随着库的发展而更新。
我们感谢您对 serde_filter 的兴趣,并期待在继续开发和改进库的过程中听到您的想法和反馈。
依赖项
~0.8–1.7MB
~37K SLoC