Преобразование 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_UNK‌​NOWN_PROPERTIES);