Jackson Object mapper将java地图转换为json维护键的顺序

Ani*_*Ani 8 java json jackson

我正在使用jackson.map.ObjectMapperAPI将地图转换为json字符串.我使用writeValueAsString方法来实现这一点.

我将基于值排序的地图传递给writeValueAsString方法.我得到的JSON字符串是基于键的.

有没有办法使用jackson将地图转换为JSON字符串,而不会干扰地图中项目的顺序.

我尝试设置Feature.SORT_PROPERTIES_ALPHABETICALLY为false,但根据文档,它仅适用于POJO类型.

任何想法实现上述行为.

pde*_*dem 12

使用Jackson 2.3.1(不知道以前的版本)你可以序列化一个SortedMap,例如一个TreeMap,该命令将得到尊重.

以下是junit 4的一个例子:

    @Test
public void testSerialize() throws JsonProcessingException{
    ObjectMapper om = new ObjectMapper();
    om.configure(SerializationFeature.WRITE_NULL_MAP_VALUES,false);
    om.configure(SerializationFeature.INDENT_OUTPUT,true);
    om.setSerializationInclusion(Include.NON_NULL);

    SortedMap<String,String> sortedMap = new TreeMap<String,String>();
    Map<String,String> map = new HashMap<String,String>();
    map.put("aaa","AAA");

    map.put("bbb","BBB");
    map.put("ccc","CCC");
    map.put("ddd","DDD");

    sortedMap.putAll(map);

    System.out.println(om.writeValueAsString(map));

    System.out.println(om.writeValueAsString(sortedMap));


}
Run Code Online (Sandbox Code Playgroud)

这是结果:`

用地图

{
  "aaa" : "AAA",
  "ddd" : "DDD",
  "ccc" : "CCC",
  "bbb" : "BBB"
}
Run Code Online (Sandbox Code Playgroud)

使用SortedMap

{
  "aaa" : "AAA",
  "bbb" : "BBB",
  "ccc" : "CCC",
  "ddd" : "DDD"
}
Run Code Online (Sandbox Code Playgroud)

`

第一个带有Map的序列化将不会被排序,带有TreeMap的第二个序列化将使用键按字母顺序排序.您可以将比较器传递给treeMap以获取不同的顺序.

编辑:即使这不是SortedMap,它也可以在Jackson上使用LinkedHashMap().这是Map的一个实现,它保持键被插入到地图中的顺序.这可能是你正在寻找的.

  • 谢谢你给这个时间.我尝试过使用treemap和linkedhashmap.我正在配置我的映射器,不使用下面的配置属性对映射进行排序.SORTED_MAPPER.configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,false); 当我将map(树形图或链接的hashmap)传递给writeValueAsString方法时,这非常正常,如下SORTED_MAPPER.writeValueAsString(map); (2认同)