我使用jackson.map.ObjectMapper API将map转换为json字符串.我使用writeValueAsString方法来实现这一点.
我传递了一个基于值排序的map到writeValueAsString方法.我得到的JSON字符串是基于键的.
有没有办法使用jackson将地图转换为JSON字符串,而不会干扰地图中项目的顺序.
我尝试将Feature.SORT_PROPERTIES_ALPHABETICALLY设置为false,但根据文档,它仅适用于POJO类型.
任何想法实现上述行为.
解决方法
使用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","ddd" : "DDD" }
`
带有Map的第一个序列化将不会被订购,
带有TreeMap的第二个将使用键按字母顺序排序.您可以将比较器传递给treeMap以获取不同的顺序.
编辑:即使这不是SortedMap,它也可以在Jackson上使用LinkedHashMap().这是Map的一个实现,它保存了键插入到地图中的顺序.这可能是你正在寻找的.