2015-01-02 3 views
2

Как я могу получить значение из объекта Java вместо строки JSON, применяя выражение JSONPath?JSONPath resolver для объектов Java


Я получаю объект Java, который создается из строки JSON (через Джексон, никак не влиять на него):

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

Я использую ObjectMapper из Jackson создать Map<String, Object> от данного объекта Java (содержащего другие карт для свойства не распознаваемо, как примитивные типов). Затем 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> 

Некоторые примечания:

  • Работы для иерархических объектов.
  • Не проверен на круговые структуры.
Смежные вопросы