Converti JsonNode în POJO

Acest lucru poate părea un pic neobisnuit, dar eu sunt în căutarea pentru o modalitate eficientă de a transforma/hartă o JsonNode "într-un" POJO.

Am un magazin al meu, Model's informații în fișiere json și eu trebuie să suport un cuplu de versiunea de modelul meu.

Ce vreau să faceți este să încărcați fișierul json în memorie într-un JsonNode, se aplică un cuplu de versionare strategii pentru a se potrivi cu cea mai recentă versiune de Modelul meu.

    ObjectMapper mapper = new ObjectMapper();
    BufferedReader fileReader = new BufferedReader(new FileReader(projPath));

    JsonNode rootNode = mapper.readTree(fileReader);

    //Upgrade our file in memory
    applyVersioningStrategy(rootNode);

    ProjectModel project = mapJsonNodeToProject(rootNode);

Dacă nu's-un mod mai rapid de a face, probabil voi sfârși pur și simplu manual de aplicarea `JsonNodes la Modelul meu

Soluția

În Jackson 2.4, puteți converti, după cum urmează:

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);

unde jsonObjectMappereste un JacksonObjectMapper`.


În versiunile mai vechi de Jackson, ar fi

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
Comentarii (6)

Acest lucru ar trebui să facă truc:

mapper.readValue(fileReader, MyClass.class);

Spun ar trebui, pentru că m-am'm, folosind asta cu String, nu BufferedReader dar ar trebui să funcționeze în continuare.

Aici's codul meu:

String inputString = // I grab my string here
MySessionClass sessionObject;
try {
    ObjectMapper objectMapper = new ObjectMapper();
    sessionObject = objectMapper.readValue(inputString, MySessionClass.class);

Aici's documentația oficială pentru acest apel: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)

Puteți defini, de asemenea, un obicei deserializer când instantia ObjectMapper: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

Edit: Tocmai mi-am amintit ceva. Dacă obiectul vin are mai multe proprietăți decât POJO` a și vrei doar să ignore extra'll doriți să setați acest lucru:

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Sau'll obține o eroare care se poate't găsi de proprietate de a pune în.

Comentarii (4)

Daca're folosind org.codehaus.jackson, acest lucru a fost posibil deoarece 1.6. Puteți converti un JsonNode la un POJO cu ObjectMapper#readValue: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNode, java.lang.Class)

 ObjectMapper mapper = new ObjectMapper();
 JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}");
 JsonNode copac = jsonParser.readValueAsTree();
 // Facem lucruri la copac
 mapper.readValue(copac, Foo.class);
Comentarii (3)
String jsonInput = "{ \"hi\": \"Assume this is the JSON\"} ";
com.fasterxml.jackson.databind.ObjectMapper mapper =
    new com.fasterxml.jackson.databind.ObjectMapper();
MyClass myObject = objectMapper.readValue(jsonInput, MyClass.class);

Dacă JSON de intrare are mai multe proprietăți decât POJO-a și vrei doar să ignore extras din Jackson 2.4, puteți configura ObjectMapper după cum urmează. Această sintaxă este diferit de vârstă Jackson versiuni. (Dacă utilizați sintaxa greșită, se va face în tăcere nimic.)

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);
Comentarii (0)