Преобразование JsonNode в POJO
Это может показаться немного необычным, но я ищу эффективный способ преобразования/отображения a JsonNode
в POJO
.
Я храню некоторые данные моей модели в json файлах, и мне приходится поддерживать пару версий моей модели.
Я загружаю json файл в память в JsonNode, применяю пару стратегий управления версиями, чтобы они соответствовали последней версии моей модели.
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);
Если не существует более быстрый способ сделать это, я, вероятно, в конечном итоге просто вручную применил JsonNodes
к моей модели
Ответы
Ответ 1
В Jackson 2.4 вы можете преобразовать следующее:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
где jsonObjectMapper
- Джексон ObjectMapper
.
В более старых версиях Джексона это было бы
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
Ответ 2
Это должно сделать трюк:
mapper.readValue(fileReader, MyClass.class);
Я говорю, потому что я использую это с String
, а не с BufferedReader
, но он все равно должен работать.
Здесь мой код:
String inputString = // I grab my string here
MySessionClass sessionObject;
try {
ObjectMapper objectMapper = new ObjectMapper();
sessionObject = objectMapper.readValue(inputString, MySessionClass.class);
Вот официальная документация для этого вызова: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html # readValue (java.lang.String, java.lang.Class)
Вы также можете определить пользовательский десериализатор при создании экземпляра ObjectMapper
:
http://wiki.fasterxml.com/JacksonHowToCustomDeserializers
Изменить:
Я просто вспомнил что-то еще. Если ваш объект имеет больше свойств, чем имеет значение POJO
, и вы просто хотите игнорировать дополнительные функции, вы хотите установить это:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Или вы получите сообщение об ошибке, что он не может найти свойство, которое нужно установить.
Ответ 3
Если вы используете org.codehaus.jackson, это было возможно с 1.6. Вы можете преобразовать JsonNode в POJO с помощью 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 tree = jsonParser.readValueAsTree();
// Do stuff to the tree
mapper.readValue(tree, Foo.class);
Ответ 4
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);
Если ваш вход JSON имеет больше свойств, чем ваш POJO, и вы просто хотите игнорировать дополнительные функции в Jackson 2.4, вы можете настроить свой ObjectMapper следующим образом. Этот синтаксис отличается от старых версий Jackson. (Если вы используете неправильный синтаксис, он молча ничего не сделает.)
mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);