通过反射生成JSON字符串,以及解析JSON字符串到对象

/**
 * Created by xiaoqi on 2017/7/19.
 */

public class JSONUtils {

   public static String ObjToJson(Object obj) {
      String json = "";
      if (obj != null) {
         StringBuffer sb = new StringBuffer();
         if (obj instanceof List) {
            sb.append("[");
            List<?> list = (List<?>) obj;
            for (int i = 0; i < list.size(); i++) {
               parseObjToJson(sb, list.get(i), true);
               if (i < list.size() - 1) {
                  sb.append(",");
               }
            }
         } else {
            parseObjToJson(sb, obj, false);
         }
         json = sb.toString();
      }
      return json;
   }

   private static void parseObjToJson(StringBuffer sb, Object obj, boolean isFromList) {
      if (sb != null && obj != null) {
         if (!isFromList) {
            sb.append("{");
         }

         List<Field> fields = new ArrayList<>();
         getAllFields(obj.getClass(), fields);
         if (!fields.isEmpty()) {
            for (int i = 0; i < fields.size(); i++) {
               Field field = fields.get(i);
               Object fieldValue = null;
               String fieldName = field.getName();
               try {
                  fieldValue = field.get(obj);
               } catch (IllegalAccessException e) {
                  e.printStackTrace();
               }

               if (fieldValue != null) {
                  sb.append("\"");
                  sb.append(fieldName);
                  sb.append("\":");
                  if (fieldValue instanceof Integer
                        || fieldValue instanceof Double ||
                        fieldValue instanceof Long ||
                        fieldValue instanceof Boolean) {
                     sb.append(fieldValue.toString());
                  } else if (fieldValue instanceof String || fieldValue instanceof UUID || fieldValue
                        instanceof Enum) {
                     sb.append("\"");
                     sb.append(fieldValue.toString());
                     sb.append("\"");
                  } else if (fieldValue instanceof List) {
                     parseListToJson(sb, fieldValue);
                  } else {
                     parseObjToJson(sb, fieldValue, false);
                  }
                  if (i != (fields.size() - 1)) {//排除最后一个字段加逗号
                     sb.append(",");
                  }
               }
            }
         } else {
            if (obj instanceof Integer || obj instanceof Double || obj instanceof Long ||
                  obj instanceof Boolean) {
               sb.append(obj.toString());
            } else if (obj instanceof String || obj instanceof UUID) {
               sb.append("\"");
               sb.append(obj.toString());
               sb.append("\"");
            }
         }
         if (!isFromList) {
            sb.append("}");
         }
      }
   }

   private static void parseListToJson(StringBuffer sb, Object fieldValue) {
      if (sb != null && fieldValue != null) {
         List list = (List) fieldValue;
         sb.append("[");
         for (int i = 0; i < list.size(); i++) {
            parseObjToJson(sb, list.get(i), true);
            if (i != (list.size() - 1)) {
               sb.append(",");
            }
         }
         sb.append("]");
      }
   }

   private static void getAllFields(Class<?> clazz, List<Field> fields) {
      if (clazz == null) {
         return;
      }
      if (fields == null) {
         fields = new ArrayList<>();
      }
      Field[] declaredFields = clazz.getFields();
      for (Field field : declaredFields) {
         if (!Modifier.isFinal(field.getModifiers())) {
            fields.add(field);
         }
      }
   }

   public static <T> T JsonToObj(JSONObject json, Class<T> clazz)
         throws InstantiationException,  ClassNotFoundException, IllegalAccessException {
      Object entity = clazz.newInstance();
      Iterator<?> keys = json.keys();
      while (keys.hasNext()) {
         try {
            Object key = keys.next();
            Object value = json.get(key.toString());
            Field field = clazz.getField(key.toString());
            field.setAccessible(true);
            try {
               field.set(entity, value);
            } catch (IllegalArgumentException e) {
               Class fieldClazz = Class.forName(field.getType().getCanonicalName());
               if(fieldClazz.isEnum()){
                  field.set(entity,  Enum.valueOf(fieldClazz, value.toString()));
               }else if("UUID".equals(fieldClazz.getSimpleName())){
                  field.set(entity,  UUID.fromString(value.toString()));
               }else if("ArrayList".equals(fieldClazz.getSimpleName())){
                  JSONArray jsonArray = (JSONArray) value;
                  ArrayList<String> arrayList = new ArrayList<>();
                  for(int i = 0; i < jsonArray.length(); i++){
                     String s = (String) jsonArray.get(i);
                     arrayList.add(s);
                  }
                  field.set(entity,  arrayList);
               }else{
                  //TODO
                  throw new RuntimeException("fieldClazz is not added");
               }

            }
         } catch (NoSuchFieldException | JSONException e) {
            e.printStackTrace();
         }

      }

      return (T)entity;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值