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

    xiaoxiao2021-04-18  92

    因为实体类中包含业务方法, 并且业务方法还是以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); } } } } }
    转载请注明原文地址: https://ju.6miu.com/read-675562.html

    最新回复(0)