一篇文章带你入门Fastjson2:Java库的“闪电”解析

介绍一个Java编程中非常实用的库——Fastjson2。

Fastjson2是一个由我国阿里巴巴团队开发的高效JSON解析库,它能够让你在处理JSON数据时,体验到飞一般的感觉。

1、Fastjson2的背景

在互联网开发领域,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。

由于其简洁易读的特点,JSON成为了网络数据传输的事实标准。

当时在Java中处理JSON数据并不总是那么容易。为此Fastjson应运而生,它旨在简化Java开发者处理JSON数据的复杂度,提高处理速度。

Fastjson2是Fastjson项目的重要升级,与Fastjson1相比,性能有非常大的提升。

性能远超过其他流行JSON库,包括jackson/gson/org.json,

性能数据: https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark

2、Fastjson2的特点

  • 速度快:Fastjson2的解析速度非常快,比其他库如Jackson和Gson要快得多。
  • 易使用:Fastjson2的API简单易用,你几乎可以无脑使用它。
  • 功能全:Fastjson2支持各种复杂类型的JSON处理,包括泛型、枚举等。
  • 可扩展:Fastjson2允许你自定义序列化和反序列化规则。
  • 支持JDK新特性
  • 完善的JSONPath支持,支持SQL:2016的JSONPath语法
  • 支持Android 8+,客户端和服务器一套API
  • 支持JSON Schema

3、Fastjson2的使用

1.添加依赖,在你的项目中添加Fastjson2的依赖。如果你使用Maven,可以在pom.xml文件中添加以下代码:

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

2.JSON字符串转Java对象

public class Test1 {
    public static void main(String[] args) {
        // 一个简单的JSON字符串
        String jsonStr = "{\"name\":\"张三\",\"age\":30}";
        // 使用Fastjson2将JSON字符串转换为Java对象
        Person person = JSON.parseObject(jsonStr, Person.class);
        // 输出转换后的对象信息
        System.out.println(person.getName());
        System.out.println(person.getAge());
    }
}
class Person {
    private String name;
    private Integer age;
    // getter和setter方法
}

3.Java对象转JSON字符串

public class Test2 {
    public static void main(String[] args) {
        // 创建一个Java对象
        Person person = new Person();
        person.setName("李四");
        person.setAge(25);
        // 使用Fastjson2将Java对象转换为JSON字符串
        String jsonStr = JSON.toJSONString(person);
        // 输出转换后的JSON字符串
        System.out.println(jsonStr);
    }
}
class Person {
    private String name;
    private Integer age;
    // getter和setter方法
}

4.将JSON解析为JSONObject


public class Test3 {
    public static void main(String[] args) {
        // 一个包含复杂类型的JSON字符串
        String jsonStr = "{\"name\":\"张三\",\"age\":30}";
        // 使用Fastjson2将JSON字符串解析为JSONObject
        JSONObject jsonObject = JSON.parseObject(jsonStr);
    }
}

5.将JSON解析为JSONArray

public class Test4 {
    public static void main(String[] args) {
        
        String text = "[30, \"age\"]";
        // 使用Fastjson2将JSON字符串转换为JSONArray
        JSONArray array = JSON.parseArray(text);

        int ageVal = array.getIntValue(0);
        String age = array.getString(1);
    }
}

6.将Java对象序列化JSONB / JSONB数据解析为Java对象

public class Test5 {
    public static void main(String[] args) {
        // 创建一个Java对象
        Person person = new Person();
        person.setName("张三");
        person.setAge(30);
        // 将Java对象序列化为JSONB
        byte[] bytes = JSONB.toBytes(user);
        byte[] bytes = JSONB.toBytes(user, JSONWriter.Feature.BeanToArray);

        //将JSONB数据解析为JavaBean
        User user = JSONB.parseObject(bytes, Person.class);
        User user = JSONB.parseObject(bytes, Person.class, JSONReader.Feature.SupportBeanArrayMapping);
    }
}

7.使用JSONPath

public class Test6 {
    public static void main(String[] args) {
        String jsonStr = "{'store':{'book':[" +
                "{'category':'1','author':'王','title':'test1','price':8}," +
                "{'category':'2','author':'李','title':'test2','price':12}]," +
                "'bicycle':{'color':'red','price':10}}}";
        
        JSONPath path = JSONPath.of("$..author"); // 缓存起来重复使用能提升性能

        // 使用JSONPath读取部分数据
        JSONReader parser1 = JSONReader.of(jsonStr);
        Object result1 = path.extract(parser1);
        System.out.println("所有author节点:" + result1);
        
        byte[] bytes = jsonStr.getBytes();

        //使用JSONPath读取部分byte[]的数据
        JSONReader parser2 = JSONReader.of(bytes);
        Object result2 = path.extract(parser2);
        System.out.println("所有author节点:" + result2);
    }
}

4、处理复杂类型

Fastjson2不仅能够处理简单的JSON数据,还能够轻松应对复杂类型,如泛型、枚举、嵌套对象等。

1.泛型处理

import com.alibaba.fastjson2.JSON;
public class Test7 {
    public static void main(String[] args) {
        // 一个包含泛型的JSON字符串
        String jsonStr = "{\"list\":[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]}";
        // 使用Fastjson2将JSON字符串转换为Java对象,其中包含泛型
        GenericList<Person> genericList = JSON.parseObject(jsonStr, GenericList.class);
        // 输出转换后的对象信息
        for (Person person : genericList) {
            System.out.println(person.getName());
            System.out.println(person.getAge());
        }
    }
}
class Person {
    private String name;
    private Integer age;
    // getter和setter方法
}
class GenericList<T> {
    private List<T> list;
    // getter和setter方法
}

2.枚举处理

import com.alibaba.fastjson2.JSON;
public class Test8 {
    public static void main(String[] args) {
        // 一个包含枚举的JSON字符串
        String jsonStr = "{\"status\":\"启用\"}";
        // 使用Fastjson2将JSON字符串转换为Java对象,其中包含枚举
        EnumStatus enumStatus = JSON.parseObject(jsonStr, EnumStatus.class);
        // 输出转换后的对象信息
        System.out.println(enumStatus);
    }
}
enum EnumStatus {
   启用,禁用
}

3.自定义序列化和反序列化

public class Test1 {
    public static void main(String[] args) {
        Person person = new Person("王五",20);
        
        // 序列化对象
        String jsonStr = JSON.toJSONString(person);
        System.out.println(jsonStr);

        //反序列化对象
        Person person1 = JSON.parseObject(jsonStr, Person.class);
        System.out.println(person1);
    }
}
@Data
class Person implements Serializable {
    private String name;
    @JSONField(writeUsing = IntegerObjectWriter.class, deserializeUsing=IntegerObjectReader.class)
    private Integer age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // getter和setter方法
}

// 自定义序列化规则
class IntegerObjectWriter implements ObjectWriter<Integer> {
    @Override
    public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
        System.out.println("写-进来过");
        //简单的将Integer类型转成字符串
        if (object instanceof Integer) {
            jsonWriter.writeString(object.toString());
        } else {
            jsonWriter.writeAny(object);
        }
    }
}
// 自定义反序列化规则
class IntegerObjectReader implements ObjectReader<Integer> {

    @Override
    public Integer readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) {
        System.out.println("读-进来过");
        return jsonReader.readInt32();
    }
}

Fastjson2的口号是——“JSON处理,唯快不破”。

Fastjson2是一个功能强大、易于使用且高效的JSON处理库。

无论是处理简单的JSON数据,还是应对复杂的类型和场景,Fastjson2都能够提供良好的支持。

通过自定义序列化和反序列化规则,Fastjson2还能够满足你个性化的需求。

安全性方面,Fastjson2提供了安全模式和非安全模式,让你在性能和安全性之间做出权衡。

这篇文章希望能够帮助你更好地理解和掌握Fastjson2的使用。