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

来源:互联网 发布:Affinity photo mac 编辑:程序博客网 时间:2024/06/08 06:13
/** * 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;   }}
阅读全文
0 0
原创粉丝点击