我有一些枚举类,让我们想象一下
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;
}
如何在 params 地图中为键设置顺序?我知道LinkedHashMap可以用于设置顺序,而只是以正确的顺序添加到地图。但!在某些情况下,应在运行时中添加键值并将其添加到 params 映射中,而不是最后一个链接中,而是在映射中。例如
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"}
}
答案 0 :(得分:2)
我可以提出两个选项,它们都依赖于Jackson使用MapSerializer
来序列化Map
类型的对象这一事实。
首先,由于enum
类型根据其声明顺序定义了隐式自然顺序,因此您可以启用ObjectMapper
的{{1}}。 Javadoc指出,
确定是否首先对
SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS
个条目进行排序的功能 是否在序列化之前按键:如果启用,则进行附加排序 必要时执行步骤(对于java.util.Map
s),如果被禁用,则无需进行其他排序。
换句话说,java.util.SortedMap
映射中的枚举将首先按其声明顺序排序,然后才进行序列化。 请注意,此序列化功能适用于所有地图。
第二,您可以将params
初始化为params
。要序列化EnumMap
,Map
会迭代地图的MapSerializer
。 entrySet()
返回的条目集按相应的EnumMap#entrySet()
类型的常量的声明顺序进行排序。你会
enum
,Jackson将按照枚举常量的声明顺序对其进行序列化。