怎样才能在java.util.ArrayList中

问题描述:

添加JsonTypeInfo(注释)我的POJO:怎样才能在java.util.ArrayList中

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" 
       } 
      ] 
} 

的问题是类型声明private Object tracks,这将导致要匹配的属性定义和强制使用的用于列表类型的信息也是如此。如果它被宣布为List<?>,这不会发生。你可以做

一件事是用“混合式注释”,以注释像联想:

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

和注册混入物适用于Album类。这应该表明预期的类型是List,并避免包含类型信息

+0

谢谢,但曲目并不总是一个列表,它可以是一个普通的pojo(如轨道),任何提示? – SingSong

+0

更改您的JSON?我没有看到象Java这样的语言的像List或POJO这样的联合类型;从打字角度来看,它们很麻烦。或者,如果你必须写一个自定义的解串器。 – StaxMan

+0

非常感谢〜我想我必须写一个反序列化器。 – SingSong