2016-02-01 72 views
0

如何使用Jackson序列化/反序列化下列對象列表?如何de /序列化與傑克遜列表<Object>?

List<Object> items = new ArrayList<Object>(); 
items.add(1);   //integer 
items.add(1.23);  //float 
items.add("abc");  //string 
items.add(Color.RED); //enum 
items.add(new Date()); //date 

可能的項目類是整數,浮點數,字符串,枚舉和日期。項目的基類是對象,因此沒有機會指定@JsonTypeInfo。

所需的輸出應該像@JsonTypeInfo的輸出,例如,

[ 
{"java.lang.Integer": 1}, 
{"java.lang.Float": 1.23}, 
{"java.lang.String": "abc"}, 
{"mypackage.Color": "RED"}, 
{"java.util.Date","2000-01-01T00:00:00+0000"} 
] 

或者

[ 
    {type:"java.lang.Integer",value: 1}, 
    {type:"java.lang.Float",value: 1.23}, 
    ... 
] 

也許我需要一個mixin這個自定義自己?

+0

請在您的文章所需的串行化輸出。 – Bnrdo

回答

1

你不能做到這一點與JsonTypeInfo。您需要一個自定義序列化程序來檢查列表中每個項目的實例並相應地序列化它們。

首先,創建列表的包裝。

@JsonSerialize(using = MyCustomListSerializer.class) 
public class ListWrapper { 
    private List<Object> list; 

    public ListWrapper(){ 
     list = new ArrayList<>(); 
    } 

    public void add(Object o){ 
     list.add(o); 
    } 

    public Object get(int i){ 
     return list.get(i); 
    } 

    public List<Object> list(){ 
     return list; 
    } 
} 

然後自定義序列

public class MyCustomListSerializer extends JsonSerializer<ListWrapper> { 
    @Override 
    public void serialize(ListWrapper value, JsonGenerator jgen, SerializerProvider provider) 
     throws IOException, JsonProcessingException { 

     jgen.writeStartArray(); 

     for(Object o : value.list()){ 
      jgen.writeStartObject(); 
      if(o instanceof Integer){ 
       jgen.writeNumberField("java.lang.Integer", (int) o); 
      }else if(o instanceof Double){ //by default, floated values are represented by double 
       jgen.writeNumberField("java.lang.Float", (double) o); 
      }else if(o instanceof Color){ 
       jgen.writeStringField("myPackage.Color", ((Color)o).toString()); 
      }else if(o instanceof Date){ 
       jgen.writeStringField("java.util.Date", o.toString()); 
      }else{ //default to String 
       jgen.writeStringField("java.lang.String", o.toString()); 
      } 
      jgen.writeEndObject(); 
     } 

     jgen.writeEndArray(); 
    } 
} 
+0

是的,謝謝。由於對象列表駐留在其他一些類中,因此我會添加mixins以使用自定義的de/serializer。 – Leon