如何将 JSON 字符串转换为 Java 对象列表?

这是我的 JSON 数组:-

[
{
"firstName" : "abc",
"lastName" : "xyz"
},
{
"firstName" : "pqr",
"lastName" : "str"
}
]

在 String 对象中有这个。现在我想把它转换成 Java 对象并存储在 Java 对象的 List 中。例如:。在 Student 对象中。 我使用以下代码将其转换为 List of Java 对象:-

ObjectMapper mapper = new ObjectMapper();
StudentList studentList = mapper.readValue(jsonString, StudentList.class);

我的 List 类是:-

public class StudentList {


private List<Student> participantList = new ArrayList<Student>();


//getters and setters
}

我的学生目标是:-

class Student {


String firstName;
String lastName;


//getters and setters
}

我错过了什么吗? 我得到以下例外:-

Exception : com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.aa.Student out of START_ARRAY token
242070 次浏览

You are asking Jackson to parse a StudentList. Tell it to parse a List (of students) instead. Since List is generic you will typically use a TypeReference

List<Student> participantJsonList = mapper.readValue(jsonString, new TypeReference<List<Student>>(){});

You can also use Gson for this scenario.

Gson gson = new Gson();
NameList nameList = gson.fromJson(data, NameList.class);


List<Name> list = nameList.getList();

Your NameList class could look like:

class NameList{
List<Name> list;
//getter and setter
}
StudentList studentList = mapper.readValue(jsonString,StudentList.class);

Change this to this one

StudentList studentList = mapper.readValue(jsonString, new TypeReference<List<Student>>(){});

I have resolved this one by creating the POJO class (Student.class) of the JSON and Main Class is used for read the values from the JSON in the problem.

   **Main Class**


public static void main(String[] args) throws JsonParseException,
JsonMappingException, IOException {


String jsonStr = "[ \r\n" + "    {\r\n" + "        \"firstName\" : \"abc\",\r\n"
+ "        \"lastName\" : \"xyz\"\r\n" + "    }, \r\n" + "    {\r\n"
+ "        \"firstName\" : \"pqr\",\r\n" + "        \"lastName\" : \"str\"\r\n" + "    } \r\n" + "]";


ObjectMapper mapper = new ObjectMapper();


List<Student> details = mapper.readValue(jsonStr, new
TypeReference<List<Student>>() {      });


for (Student itr : details) {


System.out.println("Value for getFirstName is: " +
itr.getFirstName());
System.out.println("Value for getLastName  is: " +
itr.getLastName());
}
}


**RESULT:**
Value for getFirstName is: abc
Value for getLastName  is: xyz
Value for getFirstName is: pqr
Value for getLastName  is: str




**Student.class:**


public class Student {
private String lastName;


private String firstName;


public String getLastName() {
return lastName;
}


public String getFirstName() {
return firstName;
} }

I made a method to do this below called jsonArrayToObjectList. Its a handy static class that will take a filename and the file contains an array in JSON form.

 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;
}

Try this. It works with me. Hope you too!

List<YOUR_OBJECT> testList = new ArrayList<>();
testList.add(test1);


Gson gson = new Gson();


String json = gson.toJson(testList);


Type type = new TypeToken<ArrayList<YOUR_OBJECT>>(){}.getType();


ArrayList<YOUR_OBJECT> array = gson.fromJson(json, type);

You can use below class to read list of objects. It contains static method to read a list with some specific object type. It is included Jdk8Module changes which provide new time class supports too. It is a clean and generic class.

List<Student> students = JsonMapper.readList(jsonString, Student.class);

Generic JsonMapper class:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;


import java.io.IOException;
import java.util.*;


import java.util.Collection;


public class JsonMapper {


public static <T> List<T> readList(String str, Class<T> type) {
return readList(str, ArrayList.class, type);
}


public static <T> List<T> readList(String str, Class<? extends Collection> type, Class<T> elementType) {
final ObjectMapper mapper = newMapper();
try {
return mapper.readValue(str, mapper.getTypeFactory().constructCollectionType(type, elementType));
} catch (IOException e) {
throw new RuntimeException(e);
}
}


private static ObjectMapper newMapper() {
final ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.registerModule(new JavaTimeModule());
mapper.registerModule(new Jdk8Module());
return mapper;
}
}

For any one who looks for answer yet:

1.Add jackson-databind library to your build tools like Gradle or Maven

2.in your Code:

ObjectMapper mapper = new ObjectMapper();


List<Student> studentList = new ArrayList<>();


studentList = Arrays.asList(mapper.readValue(jsonStringArray, Student[].class));

use below simple code, no need to use any other library, besides GSON

String list = "your_json_string";
Gson gson = new Gson();
Type listType = new TypeToken<ArrayList<YourClassObject>>() {}.getType();
ArrayList<YourClassObject> users = new Gson().fromJson(list , listType);

Gson only Solution

the safest way is to iterate over json array by JsonParser.parseString(jsonString).getAsJsonArray() and parase it's elements one by one by checking jsonObject.has("key").

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import lombok.Data;
@Data
class Foo {
String bar;
Double tar;
}
JsonArray jsonArray = JsonParser.parseString(jsonString).getAsJsonArray();
List<Foo> objects = new ArrayList<>();
jsonArray.forEach(jsonElement -> {
objectList.add(JsonToObject(jsonElement.getAsJsonObject()));
});
Foo parseJsonToFoo(JsonObject jsonObject) {
Foo foo = new Foo();
if (jsonObject.has("bar")) {
String data = jsonObject.get("bar").getAsString();
foo.setBar(data);
}
if (jsonObject.has("tar")) {
Double data = jsonObject.get("tar").getAsDouble();
foo.setTar(data);
}
return foo;
}