翰林优商.apk(点击下载) / JSONSerializer.java


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();
    }
}