FastJSON的序列化異常, 方法命名引起的

因爲實體類中包含業務方法, 並且業務方法還是以get開頭的, 因此在兩種方法序列化的時候都會調用次方法; 當然就會拋出異常了.
org.json 會忽略異常!

FastJSON 會拋出異常,並且異常信息簡單, 異常信息如下:

[ERROR] [16:06:08] com.jc.rest.JsonExceptionHandler: [30] - toJSON error
com.alibaba.fastjson.JSONException: toJSON error
	at com.alibaba.fastjson.JSON.toJSON(JSON.java:895)
	at com.alibaba.fastjson.JSON.toJSON(JSON.java:812)
	at com.alibaba.fastjson.JSON.toJSON(JSON.java:840)
	at com.alibaba.fastjson.JSON.toJSON(JSON.java:812)
	at com.jc.utils.HttpUtils.postJSON(HttpUtils.java:44)

下面是org.json.JSONObject 中代碼,

 private void populateMap(Object bean) {
        Class klass = bean.getClass();
        boolean includeSuperClass = klass.getClassLoader() != null;
        Method[] methods = includeSuperClass?klass.getMethods():klass.getDeclaredMethods();

        for(int i = 0; i < methods.length; ++i) {
            try {
                Method ignore = methods[i];
                if(Modifier.isPublic(ignore.getModifiers())) {
                    String name = ignore.getName();
                    String key = "";
                    if(name.startsWith("get")) {
                        if(!"getClass".equals(name) && !"getDeclaringClass".equals(name)) {
                            key = name.substring(3);
                        } else {
                            key = "";
                        }
                    } else if(name.startsWith("is")) {
                        key = name.substring(2);
                    }

                    if(key.length() > 0 && Character.isUpperCase(key.charAt(0)) && ignore.getParameterTypes().length == 0) {
                        if(key.length() == 1) {
                            key = key.toLowerCase();
                        } else if(!Character.isUpperCase(key.charAt(1))) {
                            key = key.substring(0, 1).toLowerCase() + key.substring(1);
                        }
                        Object result = ignore.invoke(bean, (Object[])null);
                        if(result != null) {
                            this.map.put(key, wrap(result));
                        }
                    }
                }
            }catch (Exception var10){
		}
	    }
	}

而fastJSON的com.alibaba.fastjson.JSON類中的toJSON方法代碼如下, 它會拋出異常,導致序列化失敗

public static Object toJSON(Object javaObject, SerializeConfig config) {
        if(javaObject == null) {
            return null;
        } else if(javaObject instanceof JSON) {
            return javaObject;
        } else {
            Iterator var17;
            Object var21;
            if(javaObject instanceof Map) {
                Map var11 = (Map)javaObject;
                JSONObject var14 = new JSONObject(var11.size());
                var17 = var11.entrySet().iterator();

                while(var17.hasNext()) {
                    Entry var20 = (Entry)var17.next();
                    var21 = var20.getKey();
                    String var23 = TypeUtils.castToString(var21);
                    Object var24 = toJSON(var20.getValue());
                    var14.put(var23, var24);
                }

                return var14;
            } else if(javaObject instanceof Collection) {
                Collection var10 = (Collection)javaObject;
                JSONArray var13 = new JSONArray(var10.size());
                var17 = var10.iterator();

                while(var17.hasNext()) {
                    Object var19 = var17.next();
                    var21 = toJSON(var19);
                    var13.add(var21);
                }

                return var13;
            } else {
                Class clazz = javaObject.getClass();
                if(clazz.isEnum()) {
                    return ((Enum)javaObject).name();
                } else if(clazz.isArray()) {
                    int var12 = Array.getLength(javaObject);
                    JSONArray var16 = new JSONArray(var12);

                    for(int var18 = 0; var18 < var12; ++var18) {
                        var21 = Array.get(javaObject, var18);
                        Object var22 = toJSON(var21);
                        var16.add(var22);
                    }

                    return var16;
                } else if(ParserConfig.isPrimitive(clazz)) {
                    return javaObject;
                } else {
                    ObjectSerializer serializer = config.getObjectWriter(clazz);
                    if(serializer instanceof JavaBeanSerializer) {
                        JavaBeanSerializer var15 = (JavaBeanSerializer)serializer;
                        JSONObject json = new JSONObject();

                        try {
                            Map e = var15.getFieldValuesMap(javaObject);
                            Iterator jsonValue = e.entrySet().iterator();

                            while(jsonValue.hasNext()) {
                                Entry entry = (Entry)jsonValue.next();
                                json.put((String)entry.getKey(), toJSON(entry.getValue()));
                            }

                            return json;
                        }catch(Exception){
                            throw new JSONException("toJSON error", var9);
                        }
                    } else {
                        String text = toJSONString(javaObject);
                        return parse(text);
                    }
                }
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章