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

时间:2014-02-17 09:01:38

标签: java json jackson

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

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

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

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

任何实现上述行为的想法。

1 个答案:

答案 0 :(得分:10)

使用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));


}

,结果如下:`

带地图

{
  "aaa" : "AAA",
  "ddd" : "DDD",
  "ccc" : "CCC",
  "bbb" : "BBB"
}

使用SortedMap

{
  "aaa" : "AAA",
  "bbb" : "BBB",
  "ccc" : "CCC",
  "ddd" : "DDD"
}

`

不会订购带地图的第一个序列化, 带有TreeMap的第二个将使用键按字母顺序排序。你可以将比较器传递给treeMap以获得不同的顺序。

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