Автор оригинала: 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(); ListlistOfDtos = 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(); ListlistOfDtos = 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(); ListlistOfDtos = 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(); ListlistOfDtos = 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 основе проекта, поэтому она должна быть легко импортировать и работать, как она есть.