#filter #operator #json #object #enums #testing #json-filter

json-filter

A library for filtering JSON values using simple query structs / enums

2 releases

new 0.1.1 Apr 13, 2025
0.1.0 Dec 26, 2024

#141 in #operator

24 downloads per month
Used in inevents-websocket-client

Apache-2.0 OR MIT

16KB
294 lines

JSON Filter

This crate allows checking if serde_json::Value matches a filter (which is JSON serializable too).

Examples:

    use serde_json::json;
    use json_filter::{Filter, Operator};

    #[test]
    fn test_numeric_operators() {
        let value = json!({ "age": 25 });

        let filter = Filter::new("age", Operator::GreaterThan(20.0));
        assert!(filter.check(&value).unwrap());

        let filter = Filter::new("age", Operator::LessThan(30.0));
        assert!(filter.check(&value).unwrap());

        let filter = Filter::new("age", Operator::GreaterOrEqual(25.0));
        assert!(filter.check(&value).unwrap());

        let filter = Filter::new("age", Operator::LessOrEqual(25.0));
        assert!(filter.check(&value).unwrap());
    }

    #[test]
    fn test_string_operators() {
        let value = json!({ "name": "John Doe" });

        let filter = Filter::new("name", Operator::StartsWith("John".to_string()));
        assert!(filter.check(&value).unwrap());

        let filter = Filter::new("name", Operator::EndsWith("Doe".to_string()));
        assert!(filter.check(&value).unwrap());

        let filter = Filter::new("name", Operator::Contains("hn D".to_string()));
        assert!(filter.check(&value).unwrap());
    }

    #[test]
    fn test_array_operators() {
        let value = json!({ "tags": ["rust", "coding", "json"] });

        let filter = Filter::new("tags", Operator::ArrayContains(json!("rust")));
        assert!(filter.check(&value).unwrap());

        let filter = Filter::new("tags[1]", Operator::Equals(json!("coding")));
        assert!(filter.check(&value).unwrap());
    }

    #[test]
    fn test_object_operators() {
        let value = json!({
            "user": {
                "id": 123,
                "details": {
                    "email": "john@example.com"
                }
            }
        });

        let filter = Filter::new("user", Operator::HasKey("id".to_string()));
        assert!(filter.check(&value).unwrap());

        let filter = Filter::new(
            "user.details.email",
            Operator::EndsWith("@example.com".to_string()),
        );
        assert!(filter.check(&value).unwrap());
    }

    #[test]
    fn test_logical_operators() {
        let value = json!({
            "age": 25,
            "name": "John Doe"
        });

        let filter = Filter::new(
            ".",
            Operator::And(vec![
                Filter::new("age", Operator::GreaterThan(20.0)),
                Filter::new("name", Operator::StartsWith("John".to_string())),
            ]),
        );
        assert!(filter.check(&value).unwrap());

        let filter = Filter::new(
            ".",
            Operator::Or(vec![
                Filter::new("age", Operator::GreaterThan(30.0)),
                Filter::new("name", Operator::Contains("John".to_string())),
            ]),
        );
        assert!(filter.check(&value).unwrap());
    }

Dependencies

~0.6–1.5MB
~32K SLoC