关于JSONArray.fromobject()方法转json乱序问题的解决方法

关于JSONArray.fromobject()方法转json乱序问题的解决方法

  • 这是第一次在这里写博客,虽然打代码的,但仍怀揣着练好文笔的梦想,本人菜鸟一个,正在加强学习
  • 这次在做数据库的课程设计时需要把查询的数据转成json传给前端,但是打印出来发现内容是乱序的,乱序的json传到前端我测试了一下显示不出来, 然后就开始找解决办法。
  • 据我查各种帖子得知,底层的JSONObject用的HashMap,所以在存入的时候就不会按顺序排列,解决办法如下:
    1. 改源码,这个操作目测是最简单的,底层jsonobject的创建大概是这样,只需要把HashMap改为LinkedHashMap就行。但是我在导源码和改的时候感觉不太对劲,也不是很懂怎么改,就放弃这种方法了
      javascript JSONObject jsonObject = new HashMap();
    2. 使用阿里巴巴的fastjson包,这个其实好像并没有解决这个问题,底层还是用hashmap,他有一个json转对象时的序列化设置,但是没有对象转json序列化的设置,所以…放弃,不过fastjson还是一个好东西,有机会研究一下
    3. 创建一个JSONArray,然后再创建一个LinkedHashMap的JSONObject,如下:
      JSONArray jsonArray = new JSONArray();
      for(User user : list){
      	JSONObeject jsonObject = new  JSONObject(new LinkedHashMap<>());
      	jsonObject.put("username",user.getUsername());
      	jsonObject.put("sex",user.getSex());
      	jsonArray.add(jsonObject);
      }
      System.out.println(jsonArray.toString());
      
      (之前的代码被我删掉了,在网页直接撸出来的(应该没有错))
      这个办法是可行的,但是有比较明显的缺陷,每个需要查询的实体类至少要写一遍这些代码,还有一些需要查询部分内容的方法一个实体类就可能要写多遍了, 另外如果一个实体类有比较多属性的话,也会浪费时间写相同性质的代码,所以我产生了造轮子的想法(按道理来说这个轮子应该已经有人造过了),然后满怀激动地造出来了,请看下一点
    4. 我造的轮子其实其实很简单,而且就只能list转json,我自己也已经想出了这个工具的多个缺陷(但是自己写出来的东西自己用的开心啊哈哈哈哈),先不一一多说,原理是反射,还有因为属性名设置的是全部小写的,但是set和get方法中首字母是大写的,所以我另外写了一下将首字母大写的工具firstToUpper,但是现在看来好像并没有必要,只是短短的三行,用的频率很低,下面上代码:
      public class JSONUtils {
      
      public static <T> String fromList(List<T> list) throws Exception{
      	//创建JSONObject
      	JSONArray jsonArray = new JSONArray();
      	for (T t : list) {
      		JSONObject jo = new JSONObject(new LinkedHashMap<>());
      		//通过反射获得类中的成员变量们
      		Field[] fields = t.getClass().getDeclaredFields();
      		for (Field field : fields) {
      			String Lname = field.getName();
      			String Uname = firstUpper.firstToUpper(Lname);
      			//通过反射获得get方法
      			Method method = t.getClass().getMethod("get" + Uname);
      			//通过get方法获得值
      			Object value = method.invoke(t);
      			jo.put(Lname, value);
      		}
      		jsonArray.add(jo);
      	}
      	return jsonArray.toJSONString();
      }
      
      public static <T> String fromList(List<T> list , String[] exclusions) throws Exception{
      	JSONArray jsonArray = new JSONArray();
      	for (T t : list) {
      		JSONObject jo = new JSONObject(new LinkedHashMap<>());
      		Field[] fields = t.getClass().getDeclaredFields();
      		for (Field field : fields) {
      			for (String s : exclusions) {
      				String Lname = field.getName();
      				if(s.equals(Lname)){
      					//该属性名需要排除
      					break;
      				}else {
      					//该属性名无需排除,添加进jsonObject中
      					String Uname = firstUpper.firstToUpper(Lname);
      					Method method = t.getClass().getMethod("get" + Uname);
      					Object value = method.invoke(t);
      					jo.put(Lname, value);
      				}
      			}
      		}
      		jsonArray.add(jo);
      	}
      	return jsonArray.toJSONString();
      }
      }
      
      缺陷很多,接下来开发应该也会遇到一些问题,会继续完善这个工具类

原来json是不用排序的。。。。见笑了,这个工具类可能以后会用得到

你可能感兴趣的:(关于JSONArray.fromobject()方法转json乱序问题的解决方法)