#serde-json #json-object #json #filtering #serde #object-key #key-value

nightly serde-filter

使用 serde 作为后端,为 JSON 对象和深层嵌套数组提供过滤抽象

2 个版本

0.1.1 2023年2月26日
0.1.0 2023年2月26日

解析器实现 中排名第 2532

MIT 许可证

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