簡體   English   中英

如何使用JSON聲明順序以枚舉鍵序列化地圖?

[英]How to serialize a map with enum keys in declaration order with JSON?

我有一些枚舉類,讓我們想象

public enum MyEnum {
    ONE("one"), TWO("two"), THREE("three"), DEFAULT("some value")
    //..
}

和Dto類:

@JsonPropertyOrder(value = {"id", "name", "params"})
public Dto {
    private Long id;
    private String name;
    private Map<MyEnum, Object> params;
}

如何設置參數映射中按鍵的順序? 我知道LinkedHashMap可以用於設置順序,而只是以正確的順序添加到地圖。 但! 在某些情況下,應在運行時中添加鍵值並將其添加到參數映射中,而不是最后一個鏈接,而是在映射內部。 例如

params = new LinkedHashMap();
params.put(ONE, new String("object1"));
params.put(THREE, new String("object #3"));

而不是我們剛剛添加的另一個代碼

params.put(TWO, new Integer(20));

json中的順序應為:

{
 "id":"123", "name":"some name", 
"params":{"ONE":"object1","TWO":"20","THREE":"object #3"}
 }

我可以建議兩個選項,它們都依賴於Jackson使用MapSerializer來序列化Map類型的對象這一事實。

首先,由於enum類型根據其聲明順序定義了隱式自然順序,因此可以啟用ObjectMapperSerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS Javadoc指出,

確定是否在序列化之前首先按鍵對java.util.Map條目進行排序的功能:如果啟用,則在必要時執行附加的排序步驟(對於java.util.SortedMap不是必需的),如果禁用,則無需進行其他排序。

換句話說,您的params映射中的枚舉將首先按其聲明順序排序,然后再進行序列化。 請注意,此序列化功能適用於所有映射。

其次,您可以將params初始化為EnumMap 要序列化MapMapSerializer會迭代地圖的entrySet() EnumMap#entrySet()返回的條目集按相應enum類型中常量的聲明順序進行排序。 你會

params = new EnumMap<>(MyEnum.class);
params.put(THREE, new String("object #3"));
params.put(ONE, new String("object1"));
// whatever order

Jackson將按照枚舉常量的聲明順序對其進行序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM