Json 如何对列表进行反序列化<;对象>;和杰克逊?

Json 如何对列表进行反序列化<;对象>;和杰克逊?,json,list,jackson,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 或 也许

如何使用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


也许我需要一个MixIn来自己定制它?

你不能用
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;
    }
}
@JsonSerialize(使用=MyCustomListSerializer.class)
公共类ListWrapper{
私人名单;
公共ListWrapper(){
列表=新的ArrayList();
}
公共无效添加(对象o){
列表。添加(o);
}
公共对象get(int i){
返回列表。获取(i);
}
公开名单(){
退货清单;
}
}
然后是自定义序列化程序

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();
    }
}
公共类MyCustomListSerializer扩展JsonSerializer{
@凌驾
公共void序列化(ListWrapper值、JsonGenerator jgen、SerializerProvider提供程序)
抛出IOException、JsonProcessingException{
jgen.writestarray();
对于(对象o:value.list()){
jgen.writeStartObject();
if(o整数的实例){
jgen.writeNumberField(“java.lang.Integer”,(int)o);
}否则,如果(o instanceof Double){//默认情况下,浮动值由Double表示
jgen.writeNumberField(“java.lang.Float”,(double)o);
}else if(o颜色实例){
writeStringField(“myPackage.Color”,((Color)o.toString());
}else if(o instanceof Date){
WriteString字段(“java.util.Date”,o.toString());
}else{//默认为字符串
WriteString字段(“java.lang.String”,o.toString());
}
jgen.writeEndObject();
}
jgen.writeEndArray();
}
}

您不能使用
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;
    }
}
@JsonSerialize(使用=MyCustomListSerializer.class)
公共类ListWrapper{
私人名单;
公共ListWrapper(){
列表=新的ArrayList();
}
公共无效添加(对象o){
列表。添加(o);
}
公共对象get(int i){
返回列表。获取(i);
}
公开名单(){
退货清单;
}
}
然后是自定义序列化程序

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();
    }
}
公共类MyCustomListSerializer扩展JsonSerializer{
@凌驾
公共void序列化(ListWrapper值、JsonGenerator jgen、SerializerProvider提供程序)
抛出IOException、JsonProcessingException{
jgen.writestarray();
对于(对象o:value.list()){
jgen.writeStartObject();
if(o整数的实例){
jgen.writeNumberField(“java.lang.Integer”,(int)o);
}否则,如果(o instanceof Double){//默认情况下,浮动值由Double表示
jgen.writeNumberField(“java.lang.Float”,(double)o);
}else if(o颜色实例){
writeStringField(“myPackage.Color”,((Color)o.toString());
}else if(o instanceof Date){
WriteString字段(“java.util.Date”,o.toString());
}else{//默认为字符串
WriteString字段(“java.lang.String”,o.toString());
}
jgen.writeEndObject();
}
jgen.writeEndArray();
}
}

请在帖子中包含所需的序列化输出。请在帖子中包含所需的序列化输出。是的,谢谢。由于对象列表位于其他一些类中,因此我将添加mixin以使用自定义反序列化程序。是的,谢谢。由于对象列表位于其他一些类中,因此我将添加mixin以使用自定义反序列化器。