FastJson详解

打印 上一主题 下一主题

主题 828|帖子 828|积分 2484

一、FastJson介绍

  FastJson 是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
   Fastjson 的长处
  

  • 速度快

    • fastjson相对其他JSON库的特点是快
    • 从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库逾越

  • 使用广泛

    • fastjson在阿里巴巴大规模使用,在数万台服务器上摆设,fastjson在业界被广泛接受
    • 在2012年被开源中国评比为最受欢迎的国产开源软件之一

  • 测试完备

    • fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个
    • 每次发布都会进行回归测试,包管质量稳固

  • 使用简朴

    • fastjson的API非常简洁

  • 功能完备

    • 支持泛型,支持流处置惩罚超大文本,支持枚举,支持序列化和反序列化扩展

二、FastJson序列化API

  序列化 : 是指将Java对象转成json格式字符串的过程。JavaBean对象、List聚集对象、Map聚集为应用最广泛的。
1、序列化Java对象

  1. @Test
  2. public void objectToJson(){
  3.     Student student = new Student();
  4.     student.setId(1);
  5.     student.setName("张三");
  6.     student.setAge(20);
  7.     student.setAddress("北京市");
  8.     String jsonString = JSON.toJSONString(student);
  9.     System.out.println(jsonString);
  10. }
  11. 结果:
  12. {"address":"北京市","age":20,"id":1,"name":"张三"}
复制代码
2、序列化List聚集

  1. @Test
  2. public void listToJson(){
  3.     Student student = new Student();
  4.     student.setId(1);
  5.     student.setName("张三");
  6.     student.setAge(20);
  7.     student.setAddress("北京市");
  8.     Student student2 = new Student();
  9.     student2.setId(2);
  10.     student2.setName("李四");
  11.     student2.setAge(22);
  12.     student2.setAddress("天津市");
  13.     List<Student> list = new ArrayList<>();
  14.     list.add(student);
  15.     list.add(student2);
  16.     String jsonString = JSON.toJSONString(list);
  17.     System.out.println(jsonString);
  18. }
  19. 结果:
  20. [{"address":"北京市","age":20,"id":1,"name":"张三"},{"address":"天津市","age":22,"id":2,"name":"李四"}]
复制代码
3、序列化Map聚集

  1. @Test
  2. public void mapToJson(){
  3.     Student student = new Student();
  4.     student.setId(1);
  5.     student.setName("张三");
  6.     student.setAge(20);
  7.     student.setAddress("北京市");
  8.     Student student2 = new Student();
  9.     student2.setId(2);
  10.     student2.setName("李四");
  11.     student2.setAge(22);
  12.     student2.setAddress("天津市");
  13.     Map<String,Student> map = new HashMap<>();
  14.     map.put("s1",student);
  15.     map.put("s2",student2);
  16.     String jsonString = JSON.toJSONString(map);
  17.     System.out.println(jsonString);
  18. }
  19. 结果:
  20. {"s1":{"address":"北京市","age":20,"id":1,"name":"张三"},"s2":{"address":"天津市","age":22,"id":2,"name":"李四"}}
复制代码
三、FashJson反序列化API

1、反序列化Java对象

  1. @Test
  2. public void jsonToObject(){
  3.     String jsonString = "{"address":"北京市","age":20,"id":1,"name":"张三"}";
  4.     Student student = JSON.parseObject(jsonString, Student.class);
  5.     System.out.println(student);
  6. }
  7. 结果:
  8. Student(id=1, name=张三, age=20, address=北京市)
复制代码
2、反序列化List聚集

  1. @Test
  2. public void jsonToList(){
  3.     String jsonString = "[{"address":"北京市","age":20,"id":1,"name":"张三"},{"address":"天津市","age":22,"id":2,"name":"李四"}]";
  4.     List<Student> list = JSON.parseArray(jsonString,Student.class);
  5.     for (int i = 0; i < list.size(); i++) {
  6.         Student student =  list.get(i);
  7.         System.out.println(student);
  8.     }
  9. }
  10. 结果:
  11. Student(id=1, name=张三, age=20, address=北京市)
  12. Student(id=2, name=李四, age=22, address=天津市)
复制代码
3、反序列化Map聚集(带泛型)



  • new TypeReference<T>(){}

    • TypeReference构造方法是protected,不可直接访问(不是子类,也不再同一个包下)
    • new 对象(){} 是匿名内部类,TypeReference的子类,new的是子类而非TypeReference

  1. @Test
  2. public void jsonToMap(){
  3.     String jsonString = "{"s1":{"address":"北京市","age":20,"id":1,"name":"张三"},"s2":{"address":"天津市","age":22,"id":2,"name":"李四"}}";
  4.     Map<String,Student> parse = JSON.parseObject(jsonString,new TypeReference<Map<String,Student>>(){});
  5.     for(String s : parse.keySet()){
  6.         System.out.println(s + ":::"+parse.get(s));
  7.     }
  8. }
  9. 结果:
  10. s1:::Student(id=1, name=张三, age=20, address=北京市)
  11. s2:::Student(id=2, name=李四, age=22, address=天津市)
复制代码
四、SerializerFeature枚举

1、默认字段为null的不显示

  1. @Test
  2. public void testDefault(){
  3.     Student student = new Student();
  4.     student.setId(1);
  5.     student.setName(null);
  6.     student.setAge(20);
  7.   //student.setAddress("北京市");
  8.     student.setDate(new Date());
  9.     String jsonString = JSON.toJSONString(student);
  10.     System.out.println(jsonString);
  11. }
  12. 结果:
  13. {"age":20,"date":1684245428959,"id":1}
复制代码


  • 枚举常量WriteMapNullValue序列化为null的字段
  1. @Test
  2. public void testSerializerFeature(){
  3.     Student student = new Student();
  4.     student.setId(1);
  5.     student.setName(null);
  6.     student.setAge(20);
  7.     //student.setAddress("北京市");
  8.     String jsonString = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);
  9.     System.out.println(jsonString);
  10. }
  11. 结果:
  12. {"address":null,"age":20,"id":1,"name":null}
复制代码


  • 枚举常量WriteNullStringAsEmpty字段为null,序列化为""
  1. @Test
  2. public void testSerializerFeature(){
  3.     Student student = new Student();
  4.     student.setId(1);
  5.     student.setName(null);
  6.     student.setAge(20);
  7.     //student.setAddress("北京市");
  8.     String jsonString = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);
  9.     System.out.println(jsonString);
  10. }
  11. 结果:
  12. {"address":"","age":20,"id":1,"name":""}
复制代码


  • 枚举常量WriteNullNumberAsZero字段为null,序列化为0
  • 枚举常量WriteNullBooleanAsFalse字段值为null,输出false
2、格式化



  • 枚举常量PrettyFormat格式化输出(为了好看)
  • 枚举常量WriteDateUseDateFormat格式化日期格式
  1. @Test
  2. public void testSerializerFeature() {
  3.     Student student = new Student();
  4.     student.setId(1);
  5.     student.setName("张三");
  6.     student.setAge(20);
  7.     student.setDate(new Date());
  8.    
  9.     String jsonString = JSON.toJSONString(student,
  10.     SerializerFeature.WriteDateUseDateFormat,
  11.     SerializerFeature.PrettyFormat);
  12.    
  13.     System.out.println(jsonString);
  14. }
  15. 结果:
  16. {
  17.         "age":20,
  18.         "date":"2023-05-16 21:54:20",
  19.         "id":1,
  20.         "name":"张三"
  21. }
复制代码
五、@JSonField注解

  该注解作用于方法上、字段上和参数上。可在序列化和反序列化时进行特性功能定制。


  • 注解属性 : name序列化后的名字
  • 注解属性 : ordinal序列化后的次序
  • 注解属性 : format序列化后的格式
  • 注解属性 : serialize是否序列化该字段
  • 注解属性 : deserialize是否反序列化该字段
  • 注解属性 : serialzeFeatures 序列化时的特性定义
  1. @Data
  2. public class Student {
  3.     @JSONField(ordinal = 2)
  4.     private Integer id;
  5.     @JSONField(name = "studentName")
  6.     private String name;
  7.     @JSONField(ordinal = 1)
  8.     private Integer age;
  9.     @JSONField(serialize = false)
  10.     private String address;
  11.     @JSONField(format = "YYYY-MM-dd")
  12.     private Date date;
  13. }
复制代码
  1. @Test
  2. public void test1() {
  3.     Student student = new Student();
  4.     student.setId(1);
  5.     student.setName("张三");
  6.     student.setAge(20);
  7.     student.setAddress("北京市");
  8.     student.setDate(new Date());
  9.     String jsonString = JSON.toJSONString(student);
  10.     System.out.println(jsonString);
  11. }
  12. 结果:
  13. {"date":"2023-05-16","studentName":"张三","age":20,"id":1}
复制代码
六、@ JSonType注解

  该注解作用于类上,对该类的字段进行序列化和反序列化时的特性功能定制。


  • 注解属性 : includes要被序列化的字段
  • 注解属性 : orders序列化后的次序
  • 注解属性 : serialzeFeatures序列化时的特性定义

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表