JSON - 仅序列化"值"使用杰克逊的地图

时间:2017-10-12 06:41:48

标签: java json serialization jackson

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

private Map<Long, StateDomain> stateDomains;

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

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

我不想。相反,我希望它成为

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

即,仅将此地图的值序列化为List,并放弃与Long键的配对。

杰克逊怎么能最好地实现这一目标?

1 个答案:

答案 0 :(得分:1)

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

  1. 肮脏的方式:
  2. 更改stateDomains的getter以仅返回StateDomain的集合:

    E.g:

    public Collection<StateDomain> getStateDomains() {
            return stateDomains.values();
     }
    
    1. 为地图创建自定义serializer
    2. E.g:

      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;