【问题标题】:JSON - serialize only "values" of the Map using JacksonJSON - 使用 Jackson 仅序列化 Map 的“值”
【发布时间】:2017-10-12 06:41:47
【问题描述】:

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

private Map<Long, StateDomain> stateDomains;

如果你只是将它序列化为 JSON,你会得到 ​​p>

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

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

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

也就是说,仅将此映射的值序列化为 List,并丢弃与 Long 键的配对。

杰克逊如何才能最好地实现这一目标?

【问题讨论】:

  • 为什么不简单地也有一个private List&lt;StateDomain&gt; stateDomainList 并将您的字段stateDomains 标记为@JsonIgnore
  • @Seelenvirtuose 我尽量减少对性能的影响。为了获得最佳性能,我需要地图。如果我保留并行字段,我还需要并行更新列表。这当然是可行的,但需要更多的逻辑。我现在在想的是使用 JsonIgnore 属性和 JsonProperty 仅返回值集的 getter 进行注释。

标签: java json serialization jackson


【解决方案1】:

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

  1. 肮脏的方式:

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

例如:

public Collection<StateDomain> getStateDomains() {
        return stateDomains.values();
 }
  1. 为地图创建自定义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;

【讨论】:

  • 我认为您不会将 getter 称为肮脏的方式。你其实可以将其命名为 getStateDomainsValues() 并通过注解将 Json 字段命名为 stateDomains。
猜你喜欢
  • 1970-01-01
  • 2013-10-06
  • 2013-12-05
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多