Конвертировать JSON в несколько объектов. Используя Джексона - PullRequest
0 голосов
/ 30 марта 2012

Я знаю, что могу конвертировать JSON в объект, используя HJackson.Ниже приведен фрагмент кода для этого.

    JsonFactory jsonFactory = new JsonFactory();
    ObjectMapper mapper = new ObjectMapper(jsonFactory);
    DTO1 user = mapper.readValue(new File("c:\\oneFile.json"),
                DTO1.class);

Но мое требование - преобразовать JSON в несколько объектов.В моем случае для нескольких объектов, таких как DTO1, DTO2 .... и также для строковых переменных, если это возможно.

Есть ли в Джексоне API для выполнения этой операции.Или есть способ, где я могу вручную выбрать и сохранить их в соответствующих DTO (Объекты).

С уважением, Каран

1 Ответ

4 голосов
/ 07 мая 2012

С http://wiki.fasterxml.com/JacksonInFiveMinutes (но также посмотрите на TypeFactory в Джексоне 1.3+):

Связывание данных с обобщенными данными

Помимо привязки к POJO и «простым» типам, существует еще один вариант: привязка к универсальным (типизированным) контейнерам. В этом случае требуется специальная обработка из-за так называемого стирания типов (используется Java для реализации обобщений в некоторой степени обратно совместимым образом), что не позволяет использовать что-то вроде Collection.class (который не компилируется).

Так что, если вы хотите привязать данные к карте, вам нужно будет использовать:

  Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });

, где TypeReference требуется только для передачи определения универсального типа (в данном случае через любой внутренний класс): важной частью является>, которая определяет тип для привязки.

Если вы этого не сделаете (и просто передадите Map.class), вызов эквивалентен привязке к Map (то есть «нетипизированная» Map), как объяснено выше.


Если вы имеете в виду полиморфную десериализацию, отметьте эту ссылку http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html, в которой обсуждается использование аннотаций Джексона, чтобы помочь мапперу выбрать правильный объект для задания.


Я написал это сегодня (я уверен, что это можно улучшить), просто взяв строку JSON и всегда преобразуя ее в список DTO (или во что бы то ни было, в которое она может быть преобразована). Это может быть вызвано с любым типом, и может быть изменено, чтобы возвратить единственный экземпляр, или Список, или что угодно. OBJECT_MAPPER является статической переменной ObjectMapper.

  public static <T> List<T> getFromJSONCollection(String jsonString, final Class<T> type) throws IOException {
    try {
      return OBJECT_MAPPER.readValue(jsonString, TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, type));
    } catch (JsonMappingException e) {
      return getFromJSON(jsonString, type);
    }
  }

  public static <T> List<T> getFromJSON(final String jsonString, final Class<T> type) throws IOException {
    return new ArrayList<T>() {{ add(OBJECT_MAPPER.readValue(jsonString, type));}};
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...