Преобразование JsonNode в POJO
это может показаться немного необычным, но я ищу эффективный способ преобразования / map 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 в моей модели
4 ответов:
в Jackson 2.4, вы можете конвертировать следующим образом:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);здесь
jsonObjectMapper- это ДжексонObjectMapper.
в старых версиях Джексона, это было бы
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
это должно сделать трюк:
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-Ява.ленг.Класс)
вы также можете определить пользовательский десериализатор при создании экземпляра
ObjectMapper: http://wiki.fasterxml.com/JacksonHowToCustomDeserializersизменить: Я только что вспомнил кое-что еще. Если ваш объект входит имеет больше свойств, чем
POJOимеет, и вы просто хотите игнорировать дополнительные функции, которые вы хотите установить это:objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);или вы получите сообщение об ошибке, что он не может найти свойство для установки.
Если вы используете org.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- Ява.ленг.Класс)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);
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 следующим образом. этот синтаксис отличается от более старых версий Джексона. (если вы используете неправильный синтаксис, он молча ничего не делать.)
mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Comments