Looking for java Keywords? Try Ask4Keywords

Java Language Уничтожьте коллекцию JSON в коллекции объектов, используя Jackson


пример

Предположим , у вас есть класс POJO Person

public class Person {
    public String name;

    public Person(String name) {
        this.name = name;
    }
}

И вы хотите разобрать его в массив JSON или карту объектов Person. Из-за стирания типа вы не можете создавать классы List<Person> и Map<String, Person> непосредственно во время выполнения (и, следовательно, использовать их для десериализации JSON) . Чтобы преодолеть это ограничение, Джексон предлагает два подхода - TypeFactory и TypeReference .

TypeFactory

Подход, использованный здесь, заключается в использовании фабрики (и ее статической функции полезности) для создания вашего типа для вас. Требуемые параметры - это коллекция, которую вы хотите использовать (список, набор и т. Д.) И класс, который вы хотите сохранить в этой коллекции.

TypeReference

Тип ссылочного подхода кажется более простым, поскольку он экономит вам немного ввода и выглядит более чистым. TypeReference принимает параметр типа, в котором вы передаете желаемый тип List<Person> . Вы просто создаете экземпляр объекта TypeReference и используете его в качестве контейнера типа.

Теперь давайте посмотрим, как фактически десериализовать JSON в объект Java. Если ваш JSON отформатирован как массив, вы можете десериализовать его как список. Если существует более сложная вложенная структура, вам необходимо десериализовать карту. Мы рассмотрим примеры обоих.

Удаление десериализации массива JSON

String jsonString = "[{\"name\": \"Alice\"}, {\"name\": \"Bob\"}]"

Подход TypeFactory

CollectionType listType = 
    factory.constructCollectionType(List.class, Person.class);
List<Preson> list = mapper.readValue(jsonString, listType);

Подход типа Type

TypeReference<Person> listType = new TypeReference<List<Person>>() {};
List<Person> list = mapper.readValue(jsonString, listType);

Десериализация карты JSON

String jsonString = "{\"0\": {\"name\": \"Alice\"}, \"1\": {\"name\": \"Bob\"}}"

Подход TypeFactory

CollectionType mapType = 
    factory.constructMapLikeType(Map.class, String.class, Person.class);
List<Person> list = mapper.readValue(jsonString, mapType);

Подход типа Type

TypeReference<Person> mapType = new TypeReference<Map<String, Person>>() {};
Map<String, Person> list = mapper.readValue(jsonString, mapType);

подробности

Используемая инструкция импорта:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;

Используемые экземпляры:

ObjectMapper mapper = new ObjectMapper();
TypeFactory factory = mapper.getTypeFactory();

Заметка

Хотя подход TypeReference может выглядеть лучше, он имеет несколько недостатков:

  1. TypeReference должен быть TypeReference с использованием анонимного класса
  2. Вы должны предоставить общую экспликацию

Несоблюдение этого может привести к потере аргумента общего типа, что приведет к неудаче десериализации.