如何使用Jackson取消/序列化List <object>?

时间:2016-02-01 06:14:11

标签: json list jackson

如何使用Jackson序列化/反序列化下面的对象列表?

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

可能的项类是整数,浮点数,字符串,枚举和日期。 items的基类是object,因此没有机会指定@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来自己定制?

1 个答案:

答案 0 :(得分: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();
    }
}