前面有同学对比了FastJson和JsonCode的性能,其认为在从Json字符串中取部分数值时,JsonCode的性能要远远优于FastJson,详细的内容请翻阅附录一。然而,正所谓“吾爱吾师,吾更爱真理”,抱着这样一种求真求实的心理,我对文章中的内容进行了探索,力求准确、符合事实。
首先,我们还是应该谈谈鸡和蛋的问题,究竟是先有鸡后有蛋呢,还是先有蛋后有鸡呢?这似乎是一个世界难题。但毋庸质疑的是,肯定是先有json字符串,后有从字符串中提炼出部分数值。这就引申到另一个问题,我们的json字符串是如何来的呢?难道是开发人员一个字符一个字符拼出来的吗?显然,不是的。那我们一般是怎么拼装json字符串呢?我想大多数人应该是这样做的。
/**
* 使用fastJson转换为json字符串
*/
public String parseObject2JsonUseFastJson() {
List<User> userList = new ArrayList<User>();
User user1 = new User();
user1.setName("Test-张三");
user1.setAge(10);
userList.add(user1);
User user2 = new User();
user2.setName("Test-李四");
user2.setAge(14);
userList.add(user2);
return JSON.toJSONString(userList);
}
那么生成的json字符串是什么样子的呢?大概是下面这个样子吧。
[
{
"age":10,
"name":"Test-张三"
},
{
"age":14,
"name":"Test-李四"
}
]
似乎跟原作者要解析的字符串不一样哦。我们分别按照FastJson和JsonCode的方式对该字符串做一个解析,源代码如下所示:
public class JsonToolComparison {
/**
* 使用fastJson转换为json字符串
*/
public String parseObject2JsonUseFastJson() {
List<User> userList = new ArrayList<User>();
User user1 = new User();
user1.setName("Test-张三");
user1.setAge(10);
userList.add(user1);
User user2 = new User();
user2.setName("Test-李四");
user2.setAge(14);
userList.add(user2);
return JSON.toJSONString(userList);
}
/**
* 使用FastJson获取某个键所对应的值
*
* @return 键所对应的值
*/
public String getValueUseFastJson(String json) {
List<User> userList = JSON.parseArray(json, User.class);
return userList.get(0).getName();
}
/**
* 使用JsonCode获取某个键所对应的值
*
* @return 键所对应的值
*/
public String getValueUseJsonCode(String json) {
String name = JsonCode.calExpressionResult(json, "listget($,0).name");
return name;
}
public static void main(String[] argv) {
JsonToolComparison jsonToolComparison = new JsonToolComparison();
String json = jsonToolComparison.parseObject2JsonUseFastJson();
// 预热10万次数据
int preTimes = 100000;
while (preTimes-- != 0) {
jsonToolComparison.getValueUseFastJson(json);
jsonToolComparison.getValueUseJsonCode(json);
}
int times = 10000000;
Stopwatch stopwatch = Stopwatch.createStarted();
for (int i = 0; i < times; i++) {
jsonToolComparison.getValueUseFastJson(json);
}
System.out.println("FastJson wastes:" + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS) + "ms");
stopwatch.reset().start();
for (int i = 0; i < times; i++) {
jsonToolComparison.getValueUseJsonCode(json);
}
System.out.println("JsonCode wastes:" + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS) + "ms");
}
}
一起来看下运行结果吧。
FastJson wastes:3590ms
JsonCode wastes:12607ms
结果不言而喻,FastJson似乎要比JsonCode强很多哦。