您的位置:

fastjson使用详解

一、fastjson简介

fastjson是一个高性能的Java JSON解析器,由阿里巴巴开发,已经成为Github上最流行的Java JSON解析库之一,也是阿里巴巴Android开发标准中JSON解析的首选库。

Fastjson支持普通JavaBean(包括内部类、泛型等)序列化和反序列化,支持数组和集合的序列化和反序列化,并支持自定义序列化、反序列化处理器和类型转换。

// Fastjson的引入方式
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.70</version>
</dependency>

二、fastjson的使用

1.序列化

序列化是将Java对象转换成JSON格式字符串的过程。Fastjson的序列化非常简单:

// Bean对象
public class User {
    private Long id;
    private String name;
    private int age;
    // 省略getter和setter
}

// 序列化
User user = new User();
user.setId(1L);
user.setName("张三");
user.setAge(25);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);

输出结果:

{"age":25,"id":1,"name":"张三"}

2.反序列化

反序列化是将JSON格式字符串转换成Java对象的过程。Fastjson同样支持反序列化:

// 反序列化
String jsonString = "{\"age\":25,\"id\":1,\"name\":\"张三\"}";
User user = JSON.parseObject(jsonString, User.class);
System.out.println(user.getName());

输出结果:

张三

3.处理日期类型

Fastjson处理日期类型非常方便,只需要在序列化与反序列化时传入日期格式即可:

// 处理日期类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String format = sdf.format(date);

String jsonString = JSON.toJSONString(date, SerializerFeature.WriteDateUseDateFormat);
System.out.println(jsonString);

Date parse = JSON.parseObject("\"" + format + "\"", Date.class);
System.out.println(parse);

输出结果:

"2022-10-18 13:38:14"
Tue Oct 18 13:38:14 CST 2022

4.处理枚举类型

Fastjson也能够处理Java中的枚举类型,只需要将枚举对象转换成其对应的字符串即可:

// 处理枚举类型
public enum ResultCode {
    SUCCESS(0, "成功"),
    FAIL(1, "失败");

    private Integer code;
    private String message;

    ResultCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    // 省略getter和setter
}

ResultCode code = ResultCode.SUCCESS;
String jsonString = JSON.toJSONString(code);
System.out.println(jsonString);

String parse = JSON.parseObject("\"SUCCESS\"", String.class);
System.out.println(parse);

输出结果:

"SUCCESS"
SUCCESS

5.处理嵌套对象

Fastjson支持序列化与反序列化的对象中包含嵌套对象:

// 处理嵌套对象
public class Student {
    private Long id;
    private String name;
    private int age;

    public class ClassRoom {
        private String name;
        private int grade;
        // 省略getter和setter
    }
    private ClassRoom classRoom;
    // 省略getter和setter
}

Student student = new Student();
student.setId(1L);
student.setName("张三");
student.setAge(25);

Student.ClassRoom classRoom = student.new ClassRoom();
classRoom.setName("一年级一班");
classRoom.setGrade(1);

student.setClassRoom(classRoom);

String jsonString = JSON.toJSONString(student);
System.out.println(jsonString);

Student parse = JSON.parseObject(jsonString, Student.class);
System.out.println(parse.getClassRoom().getName());

输出结果:

{"age":25,"classRoom":{"grade":1,"name":"一年级一班"},"id":1,"name":"张三"}
一年级一班

6.处理Map

Fastjson对于Map类型有着很好的处理支持,可以序列化与反序列化不同类型的Map:

// 处理Map
Map map = new HashMap<>();
map.put("name", "张三");
map.put("age", "25");

String jsonString = JSON.toJSONString(map);
System.out.println(jsonString);

Map
    parse = JSON.parseObject(jsonString, new TypeReference
    
     >() {});
System.out.println(parse.get("name"));

     
   
  

输出结果:

{"age":"25","name":"张三"}
张三

三、fastjson高级用法

1.自定义反序列化

Fastjson允许我们自定义反序列化处理器,以方便针对不同的数据格式进行处理。

// 自定义反序列化
public class DateDeserializer implements ObjectDeserializer {
    @Override
    public Date deserialze(DefaultJSONParser defaultJSONParser, Type type, Object o) throws ParseException {
        String value = defaultJSONParser.getLexer().stringValue();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.parse(value);
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }
}

DeserializeConfig config = new DeserializeConfig();
config.put(Date.class, new DateDeserializer());

JSONObject jsonObject = new JSONObject();
Date date = new Date();
jsonObject.put("date", date);

String jsonString = jsonObject.toJSONString();
System.out.println(jsonString);

JSONObject parse = JSON.parseObject(jsonString);
Date date1 = parse.getObject("date", Date.class);
System.out.println(date1);

输出结果:

{"date":"2022-10-18 14:34:38"}
Mon Oct 18 14:34:38 CST 2022

2.自定义序列化

Fastjson同样支持自定义序列化处理器,针对不同的数据格式进行处理。

// 自定义序列化
public class DateSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException {
        SerializeWriter writer = jsonSerializer.getWriter();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = sdf.format(o);
        writer.writeString(format);
    }
}

SerializeConfig config = new SerializeConfig();
config.put(Date.class, new DateSerializer());

JSONObject jsonObject = new JSONObject();

Date date = new Date();
jsonObject.put("date", date);

String jsonString = JSON.toJSONString(jsonObject, config);
System.out.println(jsonString);

输出结果:

{"date":"2022-10-18 14:50:03"}

3.类型转换器

Fastjson允许我们使用类型转换器,进行复杂类型的转换。

// 类型转换器
public class TypeConverter implements ParserConfig.TypeConverter {
    @Override
    public  T convert(Object value, Class
    clazz) {
        if (clazz.equals(Student.class)) {
            Student student = new Student();
            JSONObject jsonObject = (JSONObject) value;
            student.setId(jsonObject.getLong("id"));
            student.setName(jsonObject.getString("name"));
            student.setAge(jsonObject.getInteger("age"));

            Student.ClassRoom classRoom = student.new ClassRoom();
            JSONObject classRoomObject = jsonObject.getJSONObject("classRoom");
            classRoom.setName(classRoomObject.getString("name"));
            classRoom.setGrade(classRoomObject.getInteger("grade"));

            student.setClassRoom(classRoom);

            return (T) student;
        }

        return null;
    }
}

ParserConfig.getGlobalInstance().setTypeConverter(new TypeConverter());

JSONObject jsonObject = new JSONObject();

Student student = new Student();
student.setId(1L);
student.setName("张三");
student.setAge(25);

Student.ClassRoom classRoom = student.new ClassRoom();
classRoom.setName("一年级一班");
classRoom.setGrade(1);

student.setClassRoom(classRoom);

jsonObject.put("student", student);

String jsonString = JSON.toJSONString(jsonObject);
System.out.println(jsonString);

JSONObject parse = JSON.parseObject(jsonString);
Student obj = parse.getObject("student", Student.class);

System.out.println(obj.getClassRoom().getName());

   
  

输出结果:

{"student":{"age":25,"classRoom":{"grade":1,"name":"一年级一班"},"id":1,"name":"张三"}}
一年级一班

4.注解使用

Fastjson支持注解,可以对Bean对象中的字段进行注解配置,以更好的控制序列化和反序列化的结果。

// 注解使用
public class User {
    @JSONField(name = "user_id")
    private Long id;
    private String name;
    @JSONField(serialize = false)
    private int age;
    // 省略getter和setter
}

User user = new User();
user.setId(1L);
user.setName("张三");
user.setAge(25);

String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);

User parse = JSON.parseObject(jsonString, User.class);
System.out.println(parse.getId());

输出结果:

{"user_id":1,"name":"张三"}
1

四、总结

通过本篇文章对Fastjson进行了详细的说明和讲解,我们可以看到,Fastjson作为一个高性能的JSON解析器,具有非常易用的API接口和丰富的高级功能,可以满足我们在JSON序列化和反序列化中的绝大多数需求。