我正在使用jackson.map.ObjectMapper
API将地图转换为json字符串。我正在使用writeValueAsString方法来实现这一点。
我将基于值排序的地图传递给writeValueAsString
方法。我得到的JSON字符串是基于键的。
有没有办法使用jackson将地图转换为JSON字符串,而不会影响地图中项目的顺序。
我尝试将Feature.SORT_PROPERTIES_ALPHABETICALLY
设置为false,但根据文档,它仅适用于POJO类型。
任何实现上述行为的想法。
答案 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的一个实现,它保持键被插入到地图中的顺序。这可能是你正在寻找的。 p>