Вопрос-ответ

How to use Jackson to deserialise an array of objects

Как использовать Jackson для десериализации массива объектов

В документации по привязке данных Jackson указано, что Jackson поддерживает десериализацию "Массивов всех поддерживаемых типов", но я не могу понять точный синтаксис для этого.

Для одного объекта я бы сделал это:

//json input
{
"id" : "junk",
"stuff" : "things"
}

//Java
MyClass instance = objectMapper.readValue(json, MyClass.class);

Теперь для массива я хочу сделать это:

//json input
[{
"id" : "junk",
"stuff" : "things"
},
{
"id" : "spam",
"stuff" : "eggs"
}]

//Java
List<MyClass> entries = ?

Кто-нибудь знает, есть ли волшебная отсутствующая команда? Если нет, то каково решение?

Переведено автоматически
Ответ 1

Сначала создайте mapper :

import com.fasterxml.jackson.databind.ObjectMapper;// in play 2.3
ObjectMapper mapper = new ObjectMapper();

Как массив:

MyClass[] myObjects = mapper.readValue(json, MyClass[].class);

В виде списка:

List<MyClass> myObjects = mapper.readValue(jsonInput, new TypeReference<List<MyClass>>(){});

Другой способ указать тип списка:

List<MyClass> myObjects = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, MyClass.class));
Ответ 2

От Евгения Цховребова

List<MyClass> myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class))

Это решение кажется мне лучшим.

Ответ 3

For Generic Implementation:

public static <T> List<T> parseJsonArray(String json,
Class<T> classOnWhichArrayIsDefined)

throws IOException, ClassNotFoundException {
ObjectMapper mapper = new ObjectMapper();
Class<T[]> arrayClass = (Class<T[]>) Class.forName("[L" + classOnWhichArrayIsDefined.getName() + ";");
T[] objects = mapper.readValue(json, arrayClass);
return Arrays.asList(objects);
}
Ответ 4

try this

List<MyClass> list = mapper.readerForListOf(MyClass.class).readValue(json)
java json jackson