Java Jersey API返回带有不带子类属性的对象的ArrayList

Java Jersey API返回带有不带子类属性的对象的ArrayList,java,json,arraylist,subclass,Java,Json,Arraylist,Subclass,在API中,我必须返回对象(播放列表),其中包含一个带有对象(曲目)的ArrayList Playlist.java import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.util.ArrayList; import java.util.Arrays; @XmlRootElement public class Playlist {

在API中,我必须返回对象(
播放列表
),其中包含一个带有对象(
曲目
)的ArrayList

Playlist.java

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.Arrays;

@XmlRootElement
public class Playlist {
    private String owner;
    private String name;
    private ArrayList<Track> tracks;

    public Playlist() {
        this.tracks = new ArrayList<Track>();
    }

    public Playlist(String owner, String name, Track[] tracks) {
        this.owner = owner;
        this.name = name;
        this.tracks = new ArrayList<Track>(Arrays.asList(tracks));
    }

    public void addTrack(Track track) {
        this.tracks.add(track);
    }

    @XmlElement(name = "tracks")
    public ArrayList<Track> getTracks() {
        return this.tracks;
    }

    public void changeName(String name) {
        this.name = name;
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
Song.java

public class Song extends Track {

    private String album;

    public Song(String performer, String title, String url, long duration, String album) {
        super(performer, title, url, duration);
        this.album = album;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }
}
Video.java

public class Video extends Track {
    private int playCount;
    private Calendar publicationDate;
    private String description;

    public Video(String performer, String title, String url, long duration, int playCount, Calendar publicationDate, String description) {
        super(performer, title, url, duration);
        this.playCount = playCount;
        this.publicationDate = publicationDate;
        this.description = description;
    }

    public int getPlayCount() {
        return playCount;
    }

    public String getPlayCountThousandsSeperator() {
        return String.format(Locale.US, "%,d", this.playCount).replace(',', '.');
    }

    public void setPlayCount(int playCount) {
        this.playCount = playCount;
    }

    public Calendar getPublicationDate() {
        return publicationDate;
    }

    public void setPublicationDate(Calendar publicationDate) {
        this.publicationDate = publicationDate;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}
Track.java

@XmlRootElement
public class Track {
    private String performer;
    private String title;
    private String url;
    private long duration;

    public Track() {
    }

    public Track(String performer, String title, String url, long duration) {
        this.performer = performer;
        this.title = title;
        this.url = url;
        this.duration = duration;
    }

    public String getPerformer() {
        return performer;
    }

    public void setPerformer(String performer) {
        this.performer = performer;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public long getDuration() {
        return duration;
    }

    public void setDuration(long duration) {
        this.duration = duration;
    }

    public String getParsedDuration() {
        return this.getDuration() / 60 + ":" + this.getDuration() % 60;
    }
}

经过几个小时的研究,我发现它也适用于这个问题

现在从

@XmlRootElement
@XmlSeeAlso({Song.class,Video.class}) //This fixed it
public class Playlist { ... } // Omitting unchanged code

嗨,你能分享你的歌曲/视频课吗?看起来怎么样?从代码上看,您在构造函数中传递所需的内容是正确的,但仍然。。。如果可以的话!问题更新,增加歌曲、视频和曲目课程
@XmlRootElement
@XmlSeeAlso({Song.class,Video.class}) //This fixed it
public class Playlist { ... } // Omitting unchanged code