2017-10-12 104 views
0

在我的数据传输对象的地图的“价值观”,我有一个声明JSON - 序列只能用杰克逊

private Map<Long, StateDomain> stateDomains; 

如果你只是序列化这JSON,你会得到

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

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

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

也就是说,序列化此地图的值只能作为一个列表,并与长键丢弃配对。

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

+0

为什么就不能也有一个'私有列表 stateDomainList'和标记您字段'stateDomains'作为'@ JsonIgnore'? – Seelenvirtuose

+0

@Seelenvirtuose我尽量减少性能影响。为了获得最佳性能,我需要地图。如果我保持平行字段,我需要并行更新列表。这当然是可行的,但是需要更多的逻辑。我现在想的是用JsonIgnore注释该属性,并用JsonProperty注释返回值设置的getter。 –

回答

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; 
+0

我不认为你会打电话给一个肮脏的方式。实际上,您可以将其命名为getStateDomainsValues(),并通过注释生成Json字段名称stateDomains。 –