Это может показаться немного необычным, но я ищу эффективный способ, чтобы преобразовать/карта JsonNode
в случае
.
Я храню некоторые свои модели's информация в файлах 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
для моей модели
В Джексоне 2.4, можно преобразовать следующим образом:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
где jsonObjectMapper-это Джексон ObjectMapper`.
В старых версиях Джексон, было бы
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
Это следует сделать трюк:
mapper.readValue(fileReader, MyClass.class);
Я говорю, должны, потому что я'м через это с строка
, а не командой bufferedreader
но все равно должен работать.
Здесь's мой код:
String inputString = // I grab my string here
MySessionClass sessionObject;
try {
ObjectMapper objectMapper = new ObjectMapper();
sessionObject = objectMapper.readValue(inputString, MySessionClass.class);
Здесь's в официальной документации для этого вызова: 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
Редактировать:
Я просто вспомнил кое-что еще. Если ваша цель имеет больше свойств, чем в случае
, и вы просто хотите, чтобы игнорировать дополнительные услуги вы'll хочу установить это:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Или вы'll получают ошибку, что это может'т найти свойства для установки на.
Если вы're, используя орг.codehaus.Джексон, это стало возможным с 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 маппер = новый ObjectMapper(); JsonParser jsonParser = картографа.getJsonFactory().createJsonParser(" У{\"и фу\то":\"в баре\" и} себе"); Дерево JsonNode = jsonParser.readValueAsTree(); // Делаем с деревом маппер.readValue(дерево, 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);
Если в качестве входных данных JSON в POJO-объект имеет больше свойств, чем есть, и вы просто хотите, чтобы игнорировать массовка в Джексон 2.4, вы можете настроить свой ObjectMapper следующим образом. Этот синтаксис отличается от старой версии Джексона. (Если вы используете неправильный синтаксис, он молча ничего не делать.)
mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);