Проблема с отображением JSON в ArrayList с Джексоном - «вне токена START_OBJECT» - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь сопоставить JSON с ArrayList и получаю сообщение об ошибке «Невозможно десериализовать экземпляр java.util.ArrayList из маркера START_OBJECT», и я не понимаю, почему. Я нашел эту статью: Невозможно десериализовать экземпляр java.util.ArrayList из маркера START_OBJECT , решающего подобную проблему (был недопустимый JSON), но, похоже, у меня есть допустимый файл json. Я использую метод отображения, представленный в этом вопросе: Как использовать Джексона для десериализации массива объектов

Я нашел эту статью: Невозможно десериализовать экземпляр java.util.ArrayList из маркера START_OBJECT. Устранить аналогичную проблему (был недействительный JSON), но, похоже, у меня есть действительный файл json. Я использую метод отображения, представленный в этом вопросе: Как использовать Джексона для десериализации массива объектов

Мой Json выглядит так:

[
    { 
        "id": "12345", 
        "name": "John" 
    }, 
    { 
        "id": "09876", 
        "name": "Desmond" 
    }
]

Модель данных:

public class Student {

    private int id;
    private String name;

    public Student() {}

    // getters, setters and tostring
}

Код разбора:

ObjectMapper objectMapper = new ObjectMapper();

Path pathToStudentsJson = Paths.get("src/main/resources/static/students.json");
File studentsFile = new File(pathToSingleStudentJson.toString());

List<Student> listOfStudents = objectMapper.readValue(studentsFile, new TypeReference<List<Student>>(){});

Ошибка, которую я получаю:

Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
 at [Source: (File); line: 1, column: 1]
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1139)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1093)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:332)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:265)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2940)
    at io.json.JsonApp.main(JsonApp.java:46)

Process finished with exit code 1

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Хорошо, я нашел свою ошибку :) Это здесь:

Path pathToStudentsJson = Paths.get("src/main/resources/static/students.json"); 
File studentsFile = new File(pathToSingleStudentJson.toString());

Я создаю объект File, ссылаясь на неверный путь - я должен передать pathToStudentsJson в конструктор вместо pathToSingleStudentJson

0 голосов
/ 12 мая 2019

Ваша модель данных показывает, что Id - это int, тогда как в JSON это строка.Попробуйте изменить это и использовать последнюю версию Джексона.Это может решить проблему.

...