Generate JsonPath expression in java without any hard codings (Dynamically)

54 Views Asked by At

We need to send the jsonpath to client machine based on the filters selected by the user.

in the below json, we've data with coutry code as IN and ENG, I need to create Jsonpath which fetches records with Country code in "IN" or "ENG" and building having rooms 1 or 2.

{"countries":[{"country":{"countryCode":"IN","building":[{"name":"Babbage","floor":[{"level":1,"apartment":[{"rooms":2},{"rooms":3}],"lift":"working"},{"level":2,"apartment":[{"rooms":2},{"rooms":3}],"lift":"working"},{"level":2,"apartment":[{"rooms":1},{"rooms":4}],"lift":"notworking"}]},{"name":"Charles","floor":[{"level":1,"lift":"notinstalled","apartment":[{"rooms":1},{"rooms":2}]},{"level":2,"lift":"working","apartment":[{"rooms":1},{"rooms":4}]}]}]}},{"country":{"countryCode":"ENG","building":[{"name":"Babbage","floor":[{"level":1,"apartment":[{"rooms":2},{"rooms":3}],"lift":"working"},{"level":2,"apartment":[{"rooms":2},{"rooms":3}],"lift":"working"},{"level":2,"apartment":[{"rooms":1},{"rooms":4}],"lift":"notworking"}]},{"name":"Charles","floor":[{"level":1,"lift":"notinstalled","apartment":[{"rooms":1},{"rooms":2}]},{"level":2,"lift":"working","apartment":[{"rooms":1},{"rooms":4}]}]}]}}]}

I tried it with hard coded Jsonpath filter it's working fine. But I want to generate that string using java.

instead of hardcoding it as String filter = "$.building[*].floor[?(@.lift=="working")].apartment[?(@.rooms==1)]";

I want to build this filter.

Please help.

1

There are 1 best solutions below

1
William Bergström On

You can do something like:

public static String generateFilter(boolean includeIN, boolean includeENG, boolean includeRooms1, boolean includeRooms2) {
    Filter filter = Filter.filter(Criteria.where("country.countryCode").in("IN", "ENG")
        .and("building[*].floor[?(@.lift=='working')].apartment[?(@.rooms in [1, 2])]"));

    String jsonPathFilter = "$[?(@.countries[" + (includeIN ? "0" : "") + (includeENG ? ",1" : "") + "])]." +
            filter.toString();

    return jsonPathFilter;
}

You could also look into libraries like Jayway JsonPath or Gson to work with JSON data and dynamically generate JSONPath expressions or filters.