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):
JavaScript
x
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):
JavaScript
"$.foo"
"$.bar[5]"
"$.baz.someProperty"
I want to resolve those expressions using the resulting java object (instance of MyJSONInputClass, after unmarshalling):
JavaScript
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.
JavaScript
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:
JavaScript
<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.