如何使用JSON声明顺序以枚举键序列化地图?

时间:2018-10-30 23:40:57

标签: java json jackson objectmapper json-serialization

我有一些枚举类,让我们想象一下

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"}
 }

1 个答案:

答案 0 :(得分:2)

我可以提出两个选项,它们都依赖于Jackson使用MapSerializer来序列化Map类型的对象这一事实。

首先,由于enum类型根据其声明顺序定义了隐式自然顺序,因此您可以启用ObjectMapper的{​​{1}}。 Javadoc指出,

  

确定是否首先对SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS个条目进行排序的功能   是否在序列化之前按键:如果启用,则进行附加排序   必要时执行步骤(对于   java.util.Map s),如果被禁用,则无需进行其他排序。

换句话说,java.util.SortedMap映射中的枚举将首先按其声明顺序排序,然后才进行序列化。 请注意,此序列化功能适用于所有地图。

第二,您可以将params初始化为params。要序列化EnumMapMap会迭代地图的MapSerializerentrySet()返回的条目集按相应的EnumMap#entrySet()类型的常量的声明顺序进行排序。你会

enum

,Jackson将按照枚举常量的声明顺序对其进行序列化。