• 下个十年高性能 JSON 库来了:fastjson2!


    fastjson2 是 fastjson 项目的重要升级,目标是为下一个十年提供一个高性能的 JSON 库,同一套 API 支持JSON/JSONB 两种协议,JSONPath 是一等公民,支持全量解析和部分解析,支持 Java 服务端、客户端Android、大数据场景。

    具体使用

    1.添加 fastjson 2 依赖

    Maven 依赖配置如下:

      <dependency>
      <groupId>com.alibaba.fastjson2</groupId>
      <artifactId>fastjson2</artifactId>
      <version>2.0.2</version>
      </dependency>
    

    2.常用类和方法

    package com.alibaba.fastjson2;
    class JSON {
        // 将字符串解析成JSONObject
        static JSONObject parseObject(String str);
    
        // 将字符串解析成JSONArray
        static JSONArray parseArray(String str);
    
        // 将字符串解析成Java对象
        static T parseObject(byte[] utf8Bytes, Class<T> objectClass);
    
        // 将Java对象输出成字符串
        static String toJSONString(Object object);
    
        // 将Java对象输出成UT8编码的byte[]
        static byte[] toJSONBytes(Object object);
    
    }
    
    class JSONB {
        // 将jsonb格式的byte[]解析成Java对象
        static T parseObject(byte[] jsonbBytes, Class<T> objectClass);
    
        // 将Java对象输出成jsonb格式的byte[]
        static byte[] toBytes(Object object);
    
    }
    
    class JSONObject {
        Object get(String key);
        int getIntValue(String key);
        Integer getInteger(String key);
        long getLongValue(String key);
        Long getLong(String key);
        T getObject(String key, Class<T> objectClass);
    
        // 将JSONObject对象转换为Java对象
        T toJavaObject(Class<T> objectClass);
    
    }
    
    class JSONArray {
        Object get(int index);
        int getIntValue(int index);
        Integer getInteger(int index);
        long getLongValue(int index);
        Long getLong(int index);
        T getObject(int index, Class<T> objectClass);
    }
    
    class JSONPath {
        // 构造JSONPath
        static JSONPath of(String path);
    
        // 根据path直接解析输入,会部分解析优化,不会全部解析
        Object extract(JSONReader jsonReader);
    
        // 根据path对对象求值
        Object eval(Object rootObject);
    
    }
    
    class JSONReader {
        // 构造基于String输入的JSONReader
        static JSONReader of(String str);
    
        // 构造基于ut8编码byte数组输入的JSONReader
        static JSONReader of(byte[] utf8Bytes);
    
        // 构造基于char[]输入的JSONReader
        static JSONReader of(char[] chars);
    
        // 构造基于json格式byte数组输入的JSONReader
        static JSONReader ofJSONB(byte[] jsonbBytes)
    
    }
    

    3.将字符串转换成对象

    JSON 字符串转换成对象:

    String str = "{\"id\":123}";
    JSONObject jsonObject = JSON.parseObject(str);
    int id = jsonObject.getIntValue("id");
    

    JSON 字符串转换成数组:

    String str = "[\"id\", 123]";
    JSONArray jsonArray = JSON.parseArray(str);
    String name = jsonArray.getString(0);
    int id = jsonArray.getIntValue(1);
    

    4.将对象转换成 JSON 字符串

    将对象转换成 JSON 字符串:

    class Product {
        public int id;
        public String name;
    }
    
    Product product = new Product();
    product.id = 1001;
    product.name = "DataWorks";
    
    JSON.toJSONString(product);
    

    以上程序执行结果如下:

    {
        "id"    : 1001,
        "name"    : "DataWorks"
    }
    

    将数组转换成 JSON 字符串:

    JSON.toJSONString(product, JSONWriter.Feature.BeanToArray);
    

    以上程序执行结果如下:

    [123, "DataWorks"]
    

    性能测试报告

    fastjson2、fastjson1 和 jackson 使用 JMH (Java Microbenchmark Harness) 在 JDK 8 和 JDK 11 的测试数据如下:
    image.png
    以上测试数据来自 fastjson 官网:https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark

    总结

    fastjson 2 相比于 fastjson 1 性能大概提升了 200%+,它的目标是成为下一个 10 年的高性能 JSON 操作工具,但如果是老项目将 fastjson 1 升级为 fastjson 2 要慎重一些,因为 fastjson 2 不保证 100% 兼容 fastjson 1。

    引用 & 鸣谢

    https://github.com/alibaba/fastjson2/releases

    https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark

    是非审之于己,毁誉听之于人,得失安之于数。

    公众号:Java面试真题解析

    面试合集:https://gitee.com/mydb/interview

  • 相关阅读:
    【Python】ModuleNotFoundError: No module named 'matplotlib.pyplot'
    【DB2】DB2使用IMPORT命令导入含有自增长列的表报错处理
    ~~
    汉字的unicode码范围是多少?
    字符编码(ASCII,Unicode和UTF-8) 和 大小端(zz)
    是否 whether ,if
    定语从句:
    by,with
    C++中extern “C”含义深层探索
    安装Office2007时出现1706错误的解决方案
  • 原文地址:https://www.cnblogs.com/vipstone/p/16261123.html
Copyright © 2020-2023  润新知