2016-06-23 5 views
10

Ist es möglich, Jacksons ObjectMapper unmarshall nur von einem bestimmten Knoten (und 'down') in einem JSON-Baum zu haben?Verwenden von Jackson, um Objekte von bestimmten Knoten im JSON-Baum abzubilden

Der Anwendungsfall ist ein erweiterbares Dokumentformat. Ich möchte den Baum begehen und dann den aktuellen Pfad zu einem erweiterbaren Satz von Plugins veröffentlichen, um zu sehen, ob der Benutzer Plugins verwendet, die wissen, was mit diesem Teil des Dokuments zu tun ist.

Ich möchte, dass Plugin-Autoren sich nicht mit den Low-Level-Details von JsonNode oder der Streaming-API befassen müssen; stattdessen, nur einige Kontext und eine bestimmte JsonNode übergeben werden, und dann in der Lage sein, die schöne und bequeme ObjectMapper zu verwenden, um eine Instanz ihrer Klasse zu entlarven, unter Berücksichtigung des Knotens als Wurzel des Baumes übergeben.

+1

Klingt genau so: http://martinfowler.com/articles/refactoring-document-load.html#CreatingObjectsDeepInTheDocumentStructure –

Antwort

13

Betrachten Sie die folgende JSON:

{ 
    "firstName": "John", 
    "lastName": "Doe", 
    "address": { 
    "street": "21 2nd Street", 
    "city": "New York", 
    "postalCode": "10021-3100", 
    "coordinates": { 
     "latitude": 40.7250387, 
     "longitude": -73.9932568 
    } 
    } 
} 

Und betrachten Sie die coordinates Knoten in die folgende Java-Klasse analysieren möchten:

public class Coordinates { 

    private Double latitude; 

    private Double longitude; 

    // Default constructor, getters and setters omitted 
} 

Um das zu machen, analysieren die ganze JSON in ein JsonNode mit ObjectMapper:

String json = "{\"firstName\":\"John\",\"lastName\":\"Doe\",\"address\":{\"street\":" 
      + "\"21 2nd Street\",\"city\":\"New York\",\"postalCode\":\"10021-3100\"," 
      + "\"coordinates\":{\"latitude\":40.7250387,\"longitude\":-73.9932568}}}"; 

ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readTree(json); 

Dann JSON Pointer verwenden, um die coordinates Knoten abfragen und verwenden ObjectMapper es in die Coordinates Klasse zu analysieren:

JsonNode coordinatesNode = node.at("/address/coordinates"); 
Coordinates coordinates = mapper.treeToValue(coordinatesNode, Coordinates.class); 

JSON Pointer ist ein Weg, die Sprache JSON zu durchqueren. Weitere Informationen finden Sie unter RFC 6901. Es ist in Jackson seit der Version 2.3 verfügbar.

+1

Das ist genau das, was ich suchte! Ich werde das Kopfgeld vergeben, sobald ich die Chance hatte, es umzusetzen. –

+0

Ich würde sagen, 'node.get (" Adresse ")' ist einfacher/effizienter für diesen Fall. – shmosel

+1

@smosel Natürlich ist es. Aber der Punkt hier ist der JSON-Pfad, der verwendet werden kann, um nach einem Knoten zu fragen. Der JSON, den ich als Beispiel zur Verfügung gestellt habe, ist wirklich einfach und wir können die Vorteile von JSON Path nicht sehen. –