通过反射生成JSON字符串,以及解析JSON字符串到对象
2017-07-25 11:32
459 查看
/** * 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; } }
相关文章推荐
- .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
- JSON解析类库之Fastjson(1) --- Fastjson类库学习, 生成与解析json数据,json字符串与Java对象互转
- javascritp 传入对象或数组生成json字符串 解析json字符串
- js解析字符串转换成json对象 将字符串内容生成左侧菜单
- JSON解析类库之JSON-lib --- JSON-lib类库学习, 生成与解析json数据, json字符串与Java对象互转
- JsonObject生成Json字符串,并且解析为对象-----JsonReader解析Json字符串
- Golang 父子对象与JSON互相转换以及struct结构体内部的反引号该如何定义字段编码生成json字符串的写法
- 使用GSON来解析和生成JSON基础,通过传入List集合自动生成json字符串(一)
- 利用反射,自动将对象生成json字符串【反射应用的一个小DEMO】
- 通过Json和Gson,快速生成和解析json字符串
- 设计模式之1.1 再谈反射 以及java当中通过配置文件得到类名字,并生成对象的方法
- fastjson--Gson生成Json字符串,并且解析Json字符串生成对象
- 【问题-java-json】josn的发送与接收(全)解析json对象与字符串在js中的区别,以及后端spring该如何接收?
- JSON解析类库之Jackson(1) --- Jackson类库学习, 生成与解析json数据,json字符串与Java对象互转
- spring mvc底层通过消息转换器 解析json字符串/json对象成JavaBean
- HttpClient网络请求之上传Json字符串及对象解析为Json字符串
- 将任意Json字符串解析成Java对象
- Json对象与Json字符串互转(4种转换方式) jquery 以及 js 的方式
- jQuery怎么解析Json字符串(Json格式/Json对象)
- 通过 JSON 字符串来创建对象