用于Java对象的JSONPath解析器

时间:2015-01-02 14:27:00

标签: java json reflection jackson jsonpath

如何通过应用JSONPath表达式从Java对象而不是JSON字符串中获取值?


我收到一个从JSON字符串创建的Java对象(通过Jackson,无法影响它):

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

我还有一些JSONPath表达式作为反映对象中值的Java字符串(它们可能要复杂得多):

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

我想使用生成的java对象解析这些表达式(解组后的MyJSONInputClass实例):

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

2 个答案:

答案 0 :(得分:2)

我使用Jackson中的ObjectMapper从给定的Java对象创建Map<String, Object>(包含其他不可解析为基本类型的属性的映射)。然后JSONPath可以读取它并评估表达式。

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;
}

依赖性包括:

<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>

一些注意事项:

  • 适用于分层对象。
  • 未测试圆形结构。

答案 1 :(得分:0)

我们是不是增加了一点转换为 map 的开销,而是我们可以直接在 Java 对象上使用 JXPath 库