2017-10-12 128 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。 –