因为实体类中包含业务方法, 并且业务方法还是以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);
}
}
}
}
}