关于JSONObject的性能问题
现有⼀段代码:
private JSONObject override(User user, UserVO vo) {
String json = JSONString(vo);
JSONObject o = JSON.parseObject(json);
JSONObject name = new JSONObject();
if (StringUtils.Name())) {
name = JSON.Name());
o.put("name", name);
}
}
这段代码就是将⼀个VO对象转JSON字符串之后再转为对象,然后将User对象中的name属性转为对象,最后通过put⽅法获取到这个它。
其实这个逻辑是没问题的,不过我们可以尝试测试它的运⾏速度,
这是⼀段简单的测试代码:
public static void main(String[] args) {
User user = new User();
long start = System.currentTimeMillis();
String json = JSONString(user);
JSONObject o = JSON.parseObject(json);
long end = System.currentTimeMillis();
System.out.println("⽤时:"+(end - start) + "ms");
}
为了避免测试偶然性,采⽤多次测试:
第⼀次:331ms
第⼆次:348ms
第三次:367ms
第四次:328ms
第五次:307ms
第六次:383ms
可以发现,就这样⼀个简单的转换,竟然⽤时在300ms以上。
点进 parseObject() 查看原因:
public static JSONObject parseObject(String text) {
Object obj = parse(text);
if (obj instanceof JSONObject) {
return (JSONObject)obj;
} else {
try {
return (JSONObject)toJSON(obj);
} catch (RuntimeException var3) {
throw new JSONException("can not cast to JSONObject.", var3);
}
}
}
⽅法内第⼀⾏开始解析传⼊的参数,再往⾥⾯点,发现仅仅⼀步解析,就⾛了很多⽅法。
然后是toJSON():
public static Object toJSON(Object javaObject, SerializeConfig config) {
if (javaObject == null) {
return null;
} else if (javaObject instanceof JSON) {
return javaObject;
} else {
JSONObject json;
int len;
if (javaObject instanceof Map) {
Map<Object, Object> map = (Map)javaObject;
len = map.size();
Object innerMap;
if (map instanceof LinkedHashMap) {
innerMap = new LinkedHashMap(len);
} else if (map instanceof TreeMap) {
innerMap = new TreeMap();
} else {
innerMap = new HashMap(len);
}
json = new JSONObject((Map)innerMap);
Iterator var24 = Set().iterator();
while(var24.hasNext()) {
Entry<Object, Object> entry = (();
Object key = Key();
String jsonKey = TypeUtils.castToString(key);
Object jsonValue = Value(), config);
json.put(jsonKey, jsonValue);
}
return json;
} else {
Object item;
if (javaObject instanceof Collection) {
Collection<Object> collection = (Collection)javaObject;
JSONArray array = new JSONArray(collection.size());
Iterator var19 = collection.iterator();
while(var19.hasNext()) {
Object item = ();
item = toJSON(item, config);
array.add(item);
}
return array;
} else if (javaObject instanceof JSONSerializable) {
String json = toJSONString(javaObject);
return parse(json);
} else {
Class<?> clazz = Class();
if (clazz.isEnum()) {
return ((Enum)javaObject).name();
} else if (clazz.isArray()) {
len = Length(javaObject);
JSONArray array = new JSONArray(len);
for(int i = 0; i < len; ++i) {
item = (javaObject, i);
Object jsonValue = toJSON(item);
array.add(jsonValue);
}
object toreturn array;
} else if (ParserConfig.isPrimitive2(clazz)) {
return javaObject;
} else {
ObjectSerializer serializer = ObjectWriter(clazz);
if (serializer instanceof JavaBeanSerializer) {
JavaBeanSerializer javaBeanSerializer = (JavaBeanSerializer)serializer;
json = new JSONObject();
try {
Map<String, Object> values = FieldValuesMap(javaObject);                                Iterator var7 = Set().iterator();
while(var7.hasNext()) {
Entry<String, Object> entry = (();
json.put((Key(), Value(), config));
}
return json;
} catch (Exception var11) {
throw new JSONException("toJSON error", var11);
}
} else {
String text = toJSONString(javaObject);
return parse(text);
}
}
}
}
}
}
可以发现⾥⾯嵌套了4层if-else语句,逻辑⼗分复杂,甚⾄还有递归⽅法。
所以 parseObject() ⽅法的执⾏效率很低,如果出现⾼并发的情况,那很可能直接崩溃。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。