package com.czhj.sdk.common.json; import android.text.TextUtils; import com.czhj.sdk.logger.SigmobLog; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class JSONSerializer { private static Pattern linePattern = Pattern.compile("_(\\w)"); public static String Serialize(Object obj) throws CyclicObjectException { return Serialize(obj, new HashMap(), null, false); } public static String Serialize(Object obj, String str) throws CyclicObjectException { return Serialize(obj, new HashMap(), str, false); } public static String Serialize(Object obj, String str, boolean z) throws CyclicObjectException { return Serialize(obj, new HashMap(), str, z); } private static String Serialize(Object obj, HashMap<Integer, Object> hashMap, String str, boolean z) throws CyclicObjectException { if (obj == null) { return "null"; } String str2 = null; Class<?> cls = obj.getClass(); if (obj instanceof String) { str2 = SerializeString(((String) obj).replace("\"", "'")); } else if (cls.isPrimitive() || cls == Boolean.class || cls == Short.class || cls == Integer.class || cls == Long.class || cls == Float.class || cls == Double.class || cls == Byte.class || cls == Character.class) { str2 = SerializePrimitive(obj); } else if (hashMap.get(Integer.valueOf(obj.hashCode())) != null) { return "null"; } hashMap.put(Integer.valueOf(obj.hashCode()), obj); if (TextUtils.isEmpty(str2)) { if (obj instanceof List) { List list = (List) obj; str2 = SerializeArray(list.toArray(new Object[list.size()]), hashMap, z); } else { str2 = obj instanceof Map ? SerializeMap((Map) obj, hashMap, z) : cls.isArray() ? SerializeArray(obj, hashMap, z) : SerializeObject(obj, hashMap, z); } } if (TextUtils.isEmpty(str)) { return str2; } StringBuilder sb = new StringBuilder("{"); if (z) { str = lineToHump(str); } sb.append(SerializeString(str)); sb.append(':'); sb.append(str2); sb.append('}'); return sb.toString(); } private static String SerializeArray(Object obj, HashMap<Integer, Object> hashMap, boolean z) { StringBuilder sb = new StringBuilder(); sb.append("["); int length = Array.getLength(obj); for (int i = 0; i < length; i++) { sb.append(Serialize(Array.get(obj, i), hashMap, null, z)); if (i < length - 1) { sb.append(","); } } sb.append("]"); return sb.toString(); } private static String SerializeMap(Map map, HashMap<Integer, Object> hashMap, boolean z) { StringBuilder sb = new StringBuilder(); sb.append("{"); boolean z2 = false; for (Map.Entry entry : map.entrySet()) { String obj = entry.getKey().toString(); Object value = entry.getValue(); if (z2) { sb.append(","); } String SerializeString = SerializeString(obj); if (z) { SerializeString = lineToHump(SerializeString); } sb.append(SerializeString); sb.append(":"); sb.append(Serialize(value, hashMap, null, z)); z2 = true; } sb.append("}"); return sb.toString(); } private static String SerializeObject(Object obj, HashMap<Integer, Object> hashMap, boolean z) { StringBuilder sb = new StringBuilder(); sb.append("{"); Field[] declaredFields = obj.getClass().getDeclaredFields(); boolean z2 = false; for (Field field : declaredFields) { field.setAccessible(true); try { Object obj2 = field.get(obj); String name = field.getName(); boolean isStatic = Modifier.isStatic(field.getModifiers()); boolean isAnnotationPresent = field.isAnnotationPresent(Transient.class); if (!name.startsWith("this$") && !isStatic && (obj2 == null || !isAnnotationPresent)) { if (z2) { sb.append(","); } String SerializeString = SerializeString(name); if (z) { SerializeString = lineToHump(SerializeString); } sb.append(SerializeString); sb.append(":"); sb.append(Serialize(obj2, hashMap, null, z)); z2 = true; } } catch (Throwable th) { SigmobLog.e("json seriallize error", th); } } sb.append("}"); return sb.toString(); } private static String SerializePrimitive(Object obj) { return obj.toString(); } private static String SerializeString(String str) { return "\"" + str + "\""; } private static String lineToHump(String str) { if (!linePattern.matcher(str).find()) { return str; } Matcher matcher = linePattern.matcher(str.toLowerCase()); StringBuffer stringBuffer = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(stringBuffer, matcher.group(1).toUpperCase()); } matcher.appendTail(stringBuffer); return stringBuffer.toString(); } }