FastJson与JsonCode性能大比拼

本文探讨了FastJson和JsonCode在处理Json字符串性能上的差异。通过对实际操作的测试,发现FastJson在解析特定json字符串时表现出优于JsonCode的性能。详细测试过程和结果在附录中有所描述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        前面有同学对比了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强很多哦。

附录

附录一:什么?你还在使用fastjson,性能太差了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值