Hal ini mungkin tampak sedikit tidak biasa, tetapi saya mencari cara yang efisien untuk mengubah/peta JsonNode
menjadi POJO
.
Saya menyimpan beberapa Model saya's informasi dalam file json dan saya harus mendukung beberapa versi dari model saya.
Apa yang saya lakukan adalah memuat file json di memori di JsonNode, menerapkan beberapa versi strategi untuk membuatnya sesuai dengan versi terbaru dari Model saya.
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);
Kecuali ada's cara yang lebih cepat untuk melakukan itu, saya mungkin akan berakhir hanya secara manual menerapkan JsonNodes
untuk Model saya
Di Jackson 2.4, anda dapat mengkonversi sebagai berikut:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
di mana jsonObjectMapper
adalah Jackson ObjectMapper
.
Dalam versi Jackson, akan
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
Ini harus melakukan trik:
mapper.readValue(fileReader, MyClass.class);
Saya katakan harus karena aku'm menggunakan dengan String
, bukan BufferedReader
tapi itu masih harus bekerja.
Berikut ini's my kode:
String inputString = // I grab my string here
MySessionClass sessionObject;
try {
ObjectMapper objectMapper = new ObjectMapper();
sessionObject = objectMapper.readValue(inputString, MySessionClass.class);
Berikut ini's dokumentasi resmi untuk panggilan itu: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)
Anda juga dapat menentukan custom deserializer ketika anda instantiate ObjectMapper
:
http://wiki.fasterxml.com/JacksonHowToCustomDeserializers
Edit:
Aku baru ingat sesuatu yang lain. Jika objek yang akan datang dalam memiliki properti lebih dari POJO
memiliki dan anda hanya ingin mengabaikan ekstra, anda'll ingin mengatur ini:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Atau anda'll mendapatkan error yang dapat't menemukan tempat untuk mengatur ke.
Jika anda're menggunakan org.codehaus.jackson, ini telah dimungkinkan karena 1.6. Anda dapat mengkonversi JsonNode ke POJO dengan 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 pohon = jsonParser.readValueAsTree();
// Melakukan hal-hal untuk pohon
mapper.readValue(pohon, Foo.class);
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);
Jika anda JSON masukan dalam memiliki properti lebih dari anda POJO memiliki dan anda hanya ingin mengabaikan ekstra di Jackson 2.4, anda dapat mengkonfigurasi ObjectMapper sebagai berikut. Sintaks ini berbeda dari yang lebih tua Jackson versi. (Jika anda menggunakan sintaks yang salah, ia akan diam-diam melakukan apa-apa.)
mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);