Проблема преобразования Json в коллекцию с помощью Jackson ObjectIdGenerator - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь преобразовать следующие JSON в коллекцию в Java

"films" : [
        {
            "fid" : 1, 
            "title" : "The Platform", 
            "year": 2019, 
            "genre": [1,2,3], 
            "director": 1, 
            "cast": [2,3,4] , 
            "description": "A vertical prison with one cell per level. Two people per cell. One only food platform and two minutes per day to feed from up to down. An endless nightmare trapped in The Hole."
        }
],

"tvseries" : [
        {
            "tid" : 1, 
            "title" : "Breaking Bad", 
            "year": 2008, 
            "genre": [9,5,3],
            "creator": 13, 
            "cast": [14,15,16] , 
            "description": " A high school chemistry teacher diagnosed with inoperable lung cancer turns to manufacturing and selling methamphetamine in order to secure his family's future."
        }
],
"people" : [
        { "pid": 1, "name" : "Galder Gaztelu-Urrutia" }
],

 "genres" : [
        { "gid": 1, "genre": "Horror" }
]

Выше приведен только пример некоторых данных. Моя конкретная проблема связана с классом Film, а именно с следующей ошибкой: «Проблема десериализации свойства« Director »(ожидаемый тип: [простой тип, класс assignment4.model.Person]; фактический тип: assignment4.model.Film

Вот моя структура классов для Фильма и Человека:

public abstract class Media {
private String title;
private int year;
private String description;
private ArrayList<Genre> genre = new ArrayList<Genre>();
private ArrayList<Person> cast = new ArrayList<Person>();
}

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "fid")
public class Film extends Media {
    private int fid;
    private Person director;

    @Override
    public int hashCode() {
        return Arrays.hashCode(new Object[] { getFid(),  getTitle() });
    }

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "pid")
public class Person {
private int pid;
private String name;

@Override
public int hashCode() {
    return Arrays.hashCode(new Object[] { getPid(),  getName() });
}

public class Collection {

    private Set<Film> films = new TreeSet<Film>();
    private Set<Genre> genres = new TreeSet<Genre>();
    private Set<Person> people = new TreeSet<Person>();
    private Set<Profile> profiles = new TreeSet<Profile>();
    private Set<TV> tvseries = new TreeSet<TV>();
}

У всех классов есть геттеры и сеттеры для различных свойств. Я перепробовал все, что мог придумать, но не могу понять, почему он не может получить режиссера фильма.

1 Ответ

1 голос
/ 21 апреля 2020

Вы должны установить атрибут scope в ваших POJOs @JsonIdentityInfo аннотации:

@JsonIdentityInfo(
    generator = ObjectIdGenerators.PropertyGenerator.class, 
    property = "pid", scope = Person.class)
public class Person {
    private int pid;
    private String name;
// getters/setters/hashcode, etc. ...
}

@JsonIdentityInfo(
    generator = ObjectIdGenerators.PropertyGenerator.class, 
    property = "gid", scope = Genre.class
)
public class Genre {
    private int gid;
    private String genre;
// getters/setters/hashcode, etc. ...
}

@JsonIdentityInfo(
    generator = ObjectIdGenerators.PropertyGenerator.class, 
    property = "fid", scope = Film.class
)
public class Film extends Media {
    private int fid;
    private String title;
    private Person director;
// getters/setters/hashcode, etc. ...
}
...