Рубрики
Без рубрики

Джексон – Unmarshall к коллекции / Array

Как правильно сопоставить JSON Array безопасным шрифтом с коллекцией Java.

Автор оригинала: Eugen Paraschiv.

1. Обзор

Этот учебник покажет, как deserialize JSON Array к Java Array или коллекции с Джексоном 2 .

Если вы хотите копать глубже и узнать другие интересные вещи, которые вы можете сделать с Джексоном 2 – над головой, чтобы главный учебник Джексона .

2. Unmarshall к Array

Джексон может легко deserialize к Java Array:

@Test
public void givenJsonArray_whenDeserializingAsArray_thenCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
 
    ObjectMapper mapper = new ObjectMapper();
    List listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);
 
    // [{"stringValue":"a","intValue":1,"booleanValue":true},
    // {"stringValue":"bc","intValue":3,"booleanValue":false}]

    MyDto[] asArray = mapper.readValue(jsonArray, MyDto[].class);
    assertThat(asArray[0], instanceOf(MyDto.class));
}

3. Unmarshall к коллекции

Чтение того же массива JSON в Java Collection немного сложнее – по умолчанию Джексон не сможет получить полную общую информацию о типе и вместо этого создаст коллекцию Linked HashMap Экземпляров:

@Test
public void givenJsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
 
    ObjectMapper mapper = new ObjectMapper();

    List listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);

    List asList = mapper.readValue(jsonArray, List.class);
    assertThat((Object) asList.get(0), instanceOf(LinkedHashMap.class));
}

Есть два способа помочь Джексон понять правильный тип информации – мы можем использовать ТипРеференс предоставлены библиотекой именно для этой цели:

@Test
public void givenJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
 
    ObjectMapper mapper = new ObjectMapper();

    List listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);

    List asList = mapper.readValue(
      jsonArray, new TypeReference>() { });
    assertThat(asList.get(0), instanceOf(MyDto.class));
}

Или мы можем использовать перегруженный readValue метод, который принимает JavaType :

@Test
publi void givenJsonArray_whenDeserializingAsListWithJavaTypeHelp_thenCorrect() 
  throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();

    List listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);

    CollectionType javaType = mapper.getTypeFactory()
      .constructCollectionType(List.class, MyDto.class);
    List asList = mapper.readValue(jsonArray, javaType);
 
    assertThat(asList.get(0), instanceOf(MyDto.class));
}

Последнее замечание заключается в том, что MyDto класс должен иметь конструктора по умолчанию no-args – если это не так, Джексон не сможет мгновенно его :

com.fasterxml.jackson.databind.JsonMappingException: 
No suitable constructor found for type [simple type, class org.baeldung.jackson.ignore.MyDto]: 
can not instantiate from JSON object (need to add/enable type information?)

4. Заключение

Картирование массивов JSON с коллекциями Java является одной из наиболее распространенных задач, для которые используется Jackson, и эти решения имеют жизненно важное значение для получения правильной, безопасной картографической .

Реализация всех этих примеров и фрагментов кода можно найти в нашем Проект GitHub – это Maven основе проекта, поэтому она должна быть легко импортировать и работать, как она есть.