[英]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
類型根據其聲明順序定義了隱式自然順序,因此可以啟用ObjectMapper
的SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS
。 Javadoc指出,
確定是否在序列化之前首先按鍵對
java.util.Map
條目進行排序的功能:如果啟用,則在必要時執行附加的排序步驟(對於java.util.SortedMap
不是必需的),如果禁用,則無需進行其他排序。
換句話說,您的params
映射中的枚舉將首先按其聲明順序排序,然后再進行序列化。 請注意,此序列化功能適用於所有映射。
其次,您可以將params
初始化為EnumMap
。 要序列化Map
, MapSerializer
會迭代地圖的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.