【问题标题】:How can I add JsonTypeInfo (annotation) on java.util.ArrayList如何在 java.util.ArrayList 上添加 JsonTypeInfo(注释)
【发布时间】:2014-03-30 12:46:31
【问题描述】:

我的 POJO:

public class Album{

    private String title;  
    private Object tracks; // I can not change the type, beyond my control.. 

    /** setter **/
    ....
    /** getter **/
    ....
}

public class Track{

    private String title;  
    private String singer;  

    /** setter **/
    ....
    /** getter **/
    ....
}

主要方法:

public static void main(String[] args)
{
    Album album = new Album ();
    album.setTitle("Thriller");
    Track track = new Track();
    track.setTitle("Beat It");
    track.setSinger("M.J");
    List<Track> trackLst = new ArrayList<Track>();
    trackLst.add(track);
    Album.setTracks(trackLst);

    ObjectMapper mapper = new ObjectMapper();
    mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, As.PROPERTY);
    m.writeValue(System.out, album);
}
    /** console printed **/
    {
        "title": "Thriller";
        "tracks":[
            "java.util.ArrayList",
            [
                {
                    "@class":"com.hs.Track",
                    "title":"Beat It",
                    "singer":"M.J"
                }
            ]
        ]
    }        

如您所见,音轨序列化为一个 jsonArray,一个元素是类型(ArrayList),另一个是真正的 jsonArray。有什么解决方案可以保留真正的 jsonArray 吗?像这样:

{
        "title": "Thriller";
        "tracks":
            [
                {
                    "@class":"com.hs.Track",
                    "title":"Beat It",
                    "singer":"M.J"
                }
            ]
}

【问题讨论】:

    标签: object serialization jersey jackson


    【解决方案1】:

    问题是类型声明private Object tracks,这会导致属性匹配定义并强制使用列表的类型信息。如果声明为List&lt;?&gt;,则不会发生这种情况。

    您可以做的一件事是使用“混合注释”,将注释关联如下:

    public class MixIn {
      @JsonDeserialize(as=List.class)
      @JsonSerialize(as=List.class)
      private Object tracks;
    }
    

    并注册 mix-in 以应用于 Album 类。这应该表明预期的类型是List,并避免包含类型信息

    【讨论】:

    • 谢谢,但是tracks并不总是一个List,它可以是一个普通的pojo(就像一个Track),有什么提示吗?
    • 更改您的 JSON?对于 Java 等语言,我看不到联合类型(如“List 或 POJO”)的意义。从打字的角度来看,它们处理起来很麻烦。或者,如果必须,编写自定义反序列化程序。
    • 非常感谢~我想我必须写一个反序列化器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2012-07-01
    相关资源
    最近更新 更多