如何防止map形式的json字符串转json对象重新排序问题

在做报表的时候遇到从数据库查询数据已经做了排序,取出返回前台展示却是乱序的问题。经过调试发现由于数据库查回返回的数据放到了HashMap中,HashMap会根据其中的key的hashcode和equals方法进行重新排序,从而导致顺序变化问题,为了解决该问题改用LinkedHashMap。LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序。
HashMap的例子

  public static void main(String[] args) {  
  Map map = new HashMap(); 
  map.put("a3", "aa");
  map.put("a2", "bb"); 
  map.put("b1", "cc");
  for (Iterator iterator = map.values().iterator(); iterator.hasNext();)     {
        String name = (String) iterator.next(); 
        System.out.println(name);   
	 }  
  }

输出:
bb
cc
aa

LinkedHashMap例子:

 public static void main(String[] args) {   
 Map map = new LinkedHashMap();
 map.put("a3", "aa");       
 map.put("a2", "bb"); 
 map.put("b1", "cc"); 
 for (Iterator iterator = map.values().iterator(); iterator.hasNext();) {           
         String name = (String) iterator.next(); 
         System.out.println(name);     
 }
 }

输出:
aa
bb
cc
但是问题仍未完全解决,因为中间将LinkedHashMap转成了json字符串,然后用fastjson转json对像进一步处理数据。这里的底层会默认采用hashmap的那一套对map数据又重新排序一次。为了避免这个问题查了下网上的资料,解决方案如下(json为输入的json字符串):

JSONObject jsonObj = new JSONObject(true);  
Map m= jsonObj.parseObject(json, LinkedHashMap.class);  

但是输出问题还是存在第二层以后排序混乱,如下:
传入Json:
{“t1”:"",“t3”:"",“t2”:{“a1”:"",“a3”:"",“a2”:""}}
输出:
{t1=, t3=, t2={“a1”:"",“a2”:"",“a3”:""}}
解决第二层重新排序的办法(json为输入的json字符串):

HashMap m=JSON.parseObject(json,LinkedHashMap.class,Feature.OrderedField);

传入Json:
{“t1”:"",“t3”:"",“t2”:{“a1”:"",“a3”:"",“a2”:""}}
输出结果:
{t1=, t3=, t2={“a1”:"",“a3”:"",“a2”:""}}
本文参考:
https://blog.csdn.net/leiyong0326/article/details/52948219
http://inlhx.iteye.com/blog/2312512

你可能感兴趣的:(JAVA)