Как преобразовать строку JSON в объект списка Java?

Это мой массив JSON: -

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

У меня это в моем объекте String. Теперь я хочу преобразовать его в объект Java и сохранить его в списке объектов java. например В объекте Студент. Я использую ниже код, чтобы преобразовать его в объект List of Java: -

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

Мой класс списка: -

public class StudentList {

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

    //getters and setters
}

Мой объект Student: -

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

Ответ 1

Вы просите Джексона проанализировать StudentList. Скажите это, чтобы проанализировать List (студентов) вместо этого. Поскольку List является универсальным, вы обычно будете использовать TypeReference

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

Ответ 2

Вы также можете использовать Gson для этого сценария.

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

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

Ваш класс NameList может выглядеть так:

class NameList{
 List<Name> list;
 //getter and setter
}

Ответ 3

Вы можете просто конвертировать с помощью Gson

ArrayList results = new Gson(). FromJson (arrayOfJsonObject, ArrayList.class);

Или вы можете получить его как список, как показано ниже

Список результатов = Arrays.AsList(new Gson(). FromJson (arrayOfJsonObject, ArrayList.class));

Ответ 4

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

Измени это на это

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

Ответ 5

Я решил эту проблему, создав класс POJO (Student.class) из JSON, а основной класс используется для чтения значений из JSON в задаче.

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

Ответ 6

Я сделал метод для этого ниже под названием jsonArrayToObjectList. Это удобный статический класс, который принимает имя файла, а файл содержит массив в форме JSON.

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