【问题标题】:How to de/serialize List<Object> with Jackson?如何用 Jackson 反序列化 List<Object>?
【发布时间】:2016-02-02 10:34:59
【问题描述】:

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

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

【问题讨论】:

  • 请在您的帖子中包含所需的序列化输出。

标签: json list jackson


【解决方案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();
    }
}

【讨论】:

  • 好的,谢谢。由于对象列表驻留在其他一些类中,我将添加 mixins 以使用自定义反序列化器。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2013-09-23
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2015-10-02
相关资源
最近更新 更多