Samstag, Juni 6, 2020

JSONPath resolver für Java-Objekte

Wie kann ich einen Wert aus einem Java-Objekt stattdessen aus einem JSON-string durch die Anwendung einer JSONPath Ausdruck?


Erhalte ich ein Java-Objekt, das erstellt wird, aus einer JSON-Zeichenfolge (über Jackson, keine Möglichkeit, es zu beeinflussen):

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

Ich weiter haben einige JSONPath Ausdrücke als Java-Strings reflektieren Werte in das Objekt (Sie können sehr viel komplexer sein):

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

Möchte ich zur Lösung dieser Ausdrücke mit den resultierenden java-Objekt (Instanz von MyJSONInputClass, nach unmarshalling):

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

1 Kommentar

  1. 2

    Benutze ich ObjectMapper aus Jackson zu erstellen Map<String, Object> aus den gegebenen Java-Objekt (mit anderen Karten für Eigenschaften, die nicht parseable als primitive Typen). Dann JSONPath kann es Lesen und auswerten des Ausdrucks.

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

    Abhängigkeiten zu enthalten:

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

    Einige Hinweise:

    • Werke für hierarchische Objekte.
    • Nicht getestet bei kreisförmigen Strukturen.

Kostenlose Online-Tests