在我的数据传输对象中,我有一个声明

private Map<Long, StateDomain> stateDomains;


如果只是将其序列化为JSON,您将获得

{
  stateDomains:[{"key1": stateDomain1}, {"key2": stateDomain2}...]
}


我不想要的相反,我希望它成为

{
  stateDomains:[{stateDomain1}, {stateDomain2}...]
}


也就是说,仅将此地图的值序列化为列表,并放弃使用长键的配对。

杰克逊怎么能最好地做到这一点?

最佳答案

有两种方法可以执行此操作:


肮脏的方式:


更改stateDomains的getter以仅返回StateDomain的集合:

例如:

public Collection<StateDomain> getStateDomains() {
        return stateDomains.values();
 }



为地图创建自定义serializer


例如:

class CustomSerializer extends JsonSerializer<Map<Long, StateDomain>> {
    @Override
    public void serialize(final Map<Long, StateDomain> value, final JsonGenerator jgen, final SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeObject(value.values());
    }
}


在DTO中添加序列化器:

@JsonSerialize(using = CustomSerializer.class)
private Map<Long, StateDomain> stateDomains;

08-26 18:30