您的位置:首页 > Web前端 > JavaScript

通过反射生成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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JSON
相关文章推荐