几种java JSON解析库的评测单元测试及源码

迷信了很长时间的阿里,但今天突然做了一些json库的测试,结果大跌眼镜,评测
结果是,org.json库与org.simple.json库相差不多,在一个数量级,但是阿里fastjson、
net.sf.json库和Gson速度最慢。或许已经有人想喷了,但我就是呈现一个测试结果,
欢迎来指导我理解的不足,或许阿里还有很多特殊的泛型的处理和类型转换我没有用
到,本帖的所要阐明的是处理字符串解析并取得对象的一些属性没有涉及泛型时的速
度评测。

评测结果如图:

源码如下:

import junit.framework.TestCase;
import org.json.JSONException;
import org.json.simple.parser.ParseException;
import org.junit.Test;
import org.springframework.boot.json.GsonJsonParser;

import java.util.List;
import java.util.Map;

/**
 * 对比json对象执行效率
 * @author wangzhe 2020-04-14
 */
public class JSONObjectTest {

    //static final String jsonStr = "{\"m\":\"W95\",\"r\":\"0.9\",\"f\":\"90\",\"a\":\"100\",\"l\":{\"m\":\"9999999999999999\",\"r\":\"0.1\",\"f\":\"10\",\"a\":\"100\"}}";
    static final String jsonStr = "{\"m\":\"W95\",\"r\":\"0.9\",\"f\":\"90\",\"a\":\"100\",\"l\":[{\"m\":\"9999999999999999\",\"r\":\"0.1\",\"f\":\"10\",\"a\":\"100\"},{\"m\":\"FT\",\"r\":\"0.5\",\"f\":\"50\",\"a\":\"100\"}]}";

    @Test
    public void testAlibabaFastJsonParseTest() {
        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(jsonStr);
        String m = jsonObject.getString("m");
        String r = jsonObject.getString("r");
        String f = jsonObject.getString("f");
        String a = jsonObject.getString("a");
        TestCase.assertEquals("W95", m);
        TestCase.assertEquals("0.9", r);
        TestCase.assertEquals("90", f);
        TestCase.assertEquals("100", a);
        com.alibaba.fastjson.JSONArray jsonArray = jsonObject.getJSONArray("l");
        com.alibaba.fastjson.JSONObject jsonObjectSub = (com.alibaba.fastjson.JSONObject) jsonArray.get(0);
        //com.alibaba.fastjson.JSONObject jsonObjectSub = jsonObject.getJSONObject("l");
        m = jsonObjectSub.getString("m");
        r = jsonObjectSub.getString("r");
        f = jsonObjectSub.getString("f");
        a = jsonObjectSub.getString("a");
        TestCase.assertEquals("9999999999999999", m);
        TestCase.assertEquals("0.1", r);
        TestCase.assertEquals("10", f);
        TestCase.assertEquals("100", a);
        jsonObjectSub = (com.alibaba.fastjson.JSONObject) jsonArray.get(1);
        m = jsonObjectSub.getString("m");
        r = jsonObjectSub.getString("r");
        f = jsonObjectSub.getString("f");
        a = jsonObjectSub.getString("a");
        TestCase.assertEquals("FT", m);
        TestCase.assertEquals("0.5", r);
        TestCase.assertEquals("50", f);
        TestCase.assertEquals("100", a);

        System.out.println("AlibabaFastJson:"+ jsonObject.toString());
    }

    @Test
    public void testGoogleSimpleJsonParseTest() {
        try {
            org.json.simple.JSONObject jsonObject = (org.json.simple.JSONObject) new org.json.simple.parser.JSONParser().parse(jsonStr);
            String m = String.valueOf(jsonObject.get("m"));
            String r = String.valueOf(jsonObject.get("r"));
            String f = String.valueOf(jsonObject.get("f"));
            String a = String.valueOf(jsonObject.get("a"));
            TestCase.assertEquals("W95", m);
            TestCase.assertEquals("0.9", r);
            TestCase.assertEquals("90", f);
            TestCase.assertEquals("100", a);

            org.json.simple.JSONArray jsonArray = (org.json.simple.JSONArray) jsonObject.get("l");
            org.json.simple.JSONObject jsonObjectSub = (org.json.simple.JSONObject) jsonArray.get(0);
//            org.json.simple.JSONObject jsonObjectSub = (org.json.simple.JSONObject) jsonObject.get("l");
            m = String.valueOf(jsonObjectSub.get("m"));
            r = String.valueOf(jsonObjectSub.get("r"));
            f = String.valueOf(jsonObjectSub.get("f"));
            a = String.valueOf(jsonObjectSub.get("a"));
            TestCase.assertEquals("9999999999999999", m);
            TestCase.assertEquals("0.1", r);
            TestCase.assertEquals("10", f);
            TestCase.assertEquals("100", a);
            jsonObjectSub = (org.json.simple.JSONObject) jsonArray.get(1);
            m = String.valueOf(jsonObjectSub.get("m"));
            r = String.valueOf(jsonObjectSub.get("r"));
            f = String.valueOf(jsonObjectSub.get("f"));
            a = String.valueOf(jsonObjectSub.get("a"));
            TestCase.assertEquals("FT", m);
            TestCase.assertEquals("0.5", r);
            TestCase.assertEquals("50", f);
            TestCase.assertEquals("100", a);

            System.out.println("GoogleSimpleJson:"+ jsonObject.toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testOrgJsonParseTest() {
        try {
            org.json.JSONObject jsonObject = new org.json.JSONObject(jsonStr);
            String m = String.valueOf(jsonObject.get("m"));
            String r = String.valueOf(jsonObject.get("r"));
            String f = String.valueOf(jsonObject.get("f"));
            String a = String.valueOf(jsonObject.get("a"));
            TestCase.assertEquals("W95", m);
            TestCase.assertEquals("0.9", r);
            TestCase.assertEquals("90", f);
            TestCase.assertEquals("100", a);
            org.json.JSONArray jsonArray = jsonObject.getJSONArray("l");
            org.json.JSONObject jsonObjectSub = (org.json.JSONObject) jsonArray.get(0);
//            org.json.JSONObject jsonObjectSub = (org.json.JSONObject) jsonObject.get("l");
            m = String.valueOf(jsonObjectSub.get("m"));
            r = String.valueOf(jsonObjectSub.get("r"));
            f = String.valueOf(jsonObjectSub.get("f"));
            a = String.valueOf(jsonObjectSub.get("a"));
            TestCase.assertEquals("9999999999999999", m);
            TestCase.assertEquals("0.1", r);
            TestCase.assertEquals("10", f);
            TestCase.assertEquals("100", a);
            jsonObjectSub = (org.json.JSONObject) jsonArray.get(1);
            m = jsonObjectSub.getString("m");
            r = jsonObjectSub.getString("r");
            f = jsonObjectSub.getString("f");
            a = jsonObjectSub.getString("a");
            TestCase.assertEquals("FT", m);
            TestCase.assertEquals("0.5", r);
            TestCase.assertEquals("50", f);
            TestCase.assertEquals("100", a);

            System.out.println("OrgJson:        "+ jsonObject.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testNetsfJsonParseTest() {
        net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(jsonStr);
        String m = String.valueOf(jsonObject.get("m"));
        String r = String.valueOf(jsonObject.get("r"));
        String f = String.valueOf(jsonObject.get("f"));
        String a = String.valueOf(jsonObject.get("a"));
        TestCase.assertEquals("W95", m);
        TestCase.assertEquals("0.9", r);
        TestCase.assertEquals("90", f);
        TestCase.assertEquals("100", a);
        net.sf.json.JSONArray jsonArray = jsonObject.getJSONArray("l");
        net.sf.json.JSONObject jsonObjectSub = (net.sf.json.JSONObject) jsonArray.get(0);
//        net.sf.json.JSONObject jsonObjectSub = (net.sf.json.JSONObject) jsonObject.get("l");
        m = String.valueOf(jsonObjectSub.get("m"));
        r = String.valueOf(jsonObjectSub.get("r"));
        f = String.valueOf(jsonObjectSub.get("f"));
        a = String.valueOf(jsonObjectSub.get("a"));
        TestCase.assertEquals("9999999999999999", m);
        TestCase.assertEquals("0.1", r);
        TestCase.assertEquals("10", f);
        TestCase.assertEquals("100", a);
        jsonObjectSub = (net.sf.json.JSONObject) jsonArray.get(1);
        m = jsonObjectSub.getString("m");
        r = jsonObjectSub.getString("r");
        f = jsonObjectSub.getString("f");
        a = jsonObjectSub.getString("a");
        TestCase.assertEquals("FT", m);
        TestCase.assertEquals("0.5", r);
        TestCase.assertEquals("50", f);
        TestCase.assertEquals("100", a);
        System.out.println("NetsfJson:      "+ jsonObject.toString());
    }

    @Test
    public void testGsonParseTest() {
        Map<String, Object> jsonObject = new GsonJsonParser().parseMap(jsonStr);
        String m = String.valueOf(jsonObject.get("m"));
        String r = String.valueOf(jsonObject.get("r"));
        String f = String.valueOf(jsonObject.get("f"));
        String a = String.valueOf(jsonObject.get("a"));
        TestCase.assertEquals("W95", m);
        TestCase.assertEquals("0.9", r);
        TestCase.assertEquals("90", f);
        TestCase.assertEquals("100", a);
        List<Map<String, Object>> jsonObjectSubList = (List<Map<String, Object>>) jsonObject.get("l");
        Map<String, Object> jsonObjectSub = jsonObjectSubList.get(0);
//        Map<String, Object> jsonObjectSub = (Map<String, Object>) jsonObject.get("l");
        m = String.valueOf(jsonObjectSub.get("m"));
        r = String.valueOf(jsonObjectSub.get("r"));
        f = String.valueOf(jsonObjectSub.get("f"));
        a = String.valueOf(jsonObjectSub.get("a"));
        TestCase.assertEquals("9999999999999999", m);
        TestCase.assertEquals("0.1", r);
        TestCase.assertEquals("10", f);
        TestCase.assertEquals("100", a);
        jsonObjectSub = jsonObjectSubList.get(1);
        m = String.valueOf(jsonObjectSub.get("m"));
        r = String.valueOf(jsonObjectSub.get("r"));
        f = String.valueOf(jsonObjectSub.get("f"));
        a = String.valueOf(jsonObjectSub.get("a"));
        TestCase.assertEquals("FT", m);
        TestCase.assertEquals("0.5", r);
        TestCase.assertEquals("50", f);
        TestCase.assertEquals("100", a);
        System.out.println("Gson:       "+ jsonObject.toString());
    }
}

原文地址:https://blog.51cto.com/7680741/2487376

时间: 2024-07-31 05:34:36

几种java JSON解析库的评测单元测试及源码的相关文章

Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的好用,今天我们为了博客的保质保量,也就不分开写,我们直接拿比较火的Gson和Fast-json来使用,末尾在进行一些分析 Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 一.各有千秋 两大解析库的东家都是巨头,一个来自于Google官方,一个来自阿里巴巴,我们这

fastjson是阿里巴巴的开源JSON解析库

fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}", VO.class); //反序列化 https://github.com/alibaba/fastjson/wiki/Quick-Start-CN fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串

.Net Core下一次针对dpz2.Json和Newtonsoft.Json解析库的简单测试

关于dpz2.Json dpz2.Json是大胖子软件的自研Json解析库. 应用于更加简单的使用场景 在dpz2.Json诞生之前,我们一直使用的是Newtonsoft.Json解析库,Newtonsoft.Json最方便的地方是采用了类似JavaBean的绑定方式进行操作,但是实际操作时,我们可能更多时候只想要个解析器,好让我们能快速的辨别数据,这个时候,单纯的JavaBean方式又变得比较肘制,读取数据使用C#的动态类型确实可以比较方便的进行操作. 专注于直接操作 另外一个促使我们自研一个

Java集合干货系列-(一)ArrayList源码解析

前言 今天来介绍下ArrayList,在集合框架整体框架一章中,我们介绍了List接口,ArrayList继承了AbstractList,实现了List.ArrayList在工作中经常用到,所以要弄懂这个类是极其重要的.构造图如下:蓝色线条:继承绿色线条:接口实现 正文 ArrayList简介 ArrayList定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomA

【转】Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Hashtable介绍第2部分 Hashtable数据结构第3部分 Hashtable源码解析(基于JDK1.6.0_45)第4部分 Hashtable遍历方式第5部分 Hashtable示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3310887.h

(转)Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45)第4部分 LinkedList遍历方式第5部分 LinkedL

Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMap数据结构第3部分 HashMap源码解析(基于JDK1.6.0_45)第3.1部分 HashMap的“拉链法”相关内容第3.2部分 HashMap的构造函数第3.3部分 HashMap的主要对外接口第3.4部分 HashMap实现的Cloneable接口第3.5部分 HashMap实现的Seria

Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例

概要 这一章,我们对TreeSet进行学习.我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet.内容包括:第1部分 TreeSet介绍第2部分 TreeSet数据结构第3部分 TreeSet源码解析(基于JDK1.6.0_45)第4部分 TreeSet遍历方式第5部分 TreeSet示例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311268 第1部

【转】 Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.内容包括:第1部分 Stack介绍第2部分 Stack源码解析(基于JDK1.6.0_45)第3部分 Vector示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308852.html 第1部分 Stack介绍 Stack简介 Stack是栈.它的