Как преобразовать json response в массив/коллекцию объектов?
Я могу преобразовать response в объект, используя Object object = response.extract.as(Object.class). Однако, как быть если response включает в себя массив объектов? т.е. выглядит респонс выглядит как то так:
[
"object": {
*контент*
}
"object": {
*контент*
}
]
Ответы (3 шт):
Например, вот: это pojo-класс
class Pojo {
private String user;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
}
а это собственно код:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.List;
public class App {
public static void main(String[] arg) throws IOException {
String jsonStr = "[\n"
+ "{\"user\": \"Вася\"},\n"
+ "{\"user\": \"Петя\"},\n"
+ "{\"user\": \"Маша\"}\n"
+ "]";
// 1 способ - List<Pojo>
List<Pojo> r1 = parseJson1(jsonStr);
for (Pojo p : r1) {
System.out.println(p.getUser());
}
// 2 способ - Pojo[]
Pojo[] r2 = parseJson2(jsonStr);
for (Pojo p : r2) {
System.out.println(p.getUser());
}
}
private static List<Pojo> parseJson1(String value) throws IOException {
ObjectMapper mapper = new ObjectMapper();
List<Pojo> result = mapper.readValue(value, new TypeReference<List<Pojo>>() {
});
return result;
}
private static Pojo[] parseJson2(String value) throws IOException {
ObjectMapper mapper = new ObjectMapper();
Pojo[] result = mapper.readValue(value, Pojo[].class);
return result;
}
}
ну и в pom:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.3</version>
</dependency>
а вообще гуглится.)
Можно использовать ObjectMapper для преобразования строки json в какой-либо объект, в данном случае в List<Map<String, Object>>.
Для примера возьмём json с массивом объектов:
[
{
"id": 1,
"name": "Иван"
},
{
"id": 2,
"name": "Фёдор"
}
]
Зависимость Maven:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.11.1</version>
</dependency>
Читаем строку json в объект List и выводим результат:
String json = "[{\"id\":1,\"name\":\"Иван\"},{\"id\":2,\"name\":\"Фёдор\"}]";
ObjectMapper mapper = new ObjectMapper();
List<Map<String, Object>> list = mapper.readValue(json, List.class);
System.out.println(list); // [{id=1, name=Иван}, {id=2, name=Фёдор}]
Можно просто читать строку json в объект:
String json = "[{\"id\":1,\"name\":\"Иван\"},{\"id\":2,\"name\":\"Фёдор\"}]";
ObjectMapper mapper = new ObjectMapper();
Object object = mapper.readValue(json, Object.class);
System.out.println(object); // [{id=1, name=Иван}, {id=2, name=Фёдор}]
НО: при последующей обработке этого объекта потребуется приведение его к какому-либо типу (Map, List и т. д.).
Можно собственный алгоритм написать представления объекта в виде плоской карты:
List<Items> items = jsonArrayToObjectList(
"domain/ItemsArray.json", Item.class);
public static <T> List<T> jsonArrayToObjectList(String jsonFileName, Class<T> tClass) throws IOException {
ObjectMapper mapper = new ObjectMapper();
final File file = ResourceUtils.getFile("classpath:" + jsonFileName);
CollectionType listType = mapper.getTypeFactory()
.constructCollectionType(ArrayList.class, tClass);
List<T> ts = mapper.readValue(file, listType);
return ts;
}