Skip to content
Advertisement

JSONPath resolver for Java objects

How can I get a value from an Java object instead from a JSON string by applying a JSONPath expression?


I receive a Java object that is created from a JSON string (via Jackson, no way to influence it):

public class MyJSONInputClass {
    private String foo;
    private int[] bar = { 1, 5, 9 };
    private OtherClass baz;
    ....
}

I further have some JSONPath expressions as Java Strings reflecting values in the object (they might be much more complex):

"$.foo"
"$.bar[5]"
"$.baz.someProperty"

I want to resolve those expressions using the resulting java object (instance of MyJSONInputClass, after unmarshalling):

public Object resolve(MyJSONInputClass input, String expression) {
    ...
}

Advertisement

Answer

I use ObjectMapper from Jackson to create a Map<String, Object> from the given Java object (containing other maps for properties not parseable as primitive types). Then JSONPath can read it and evaluate the expression.

public Object resolve(Object input, String expression) {
    // Get the mapper with default config.
    ObjectMapper mapper = new ObjectMapper();

    // Make the object traversable by JSONPath.
    Map<String, Object> mappedObject = mapper.convertValue(input, Map.class);

    // Evaluate that expression
    Object output = JsonPath.read(mappedObject, expression);

    return output;
}

Dependencies to include:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>1.2.0</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.4</version>
</dependency>

Some notes:

  • Works for hierarchical objects.
  • Not tested for circular structures.
Advertisement