Преобразование 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 в моей модели

607   4  

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_UNK‌​NOWN_PROPERTIES);

Comments

    Ничего не найдено.