FastJson详解
创始人
2025-01-09 08:05:24
0

文章目录

  • 一、FastJson介绍
  • 二、FastJson序列化API
    • 1、序列化Java对象
    • 2、序列化List集合
    • 3、序列化Map集合
  • 三、FashJson反序列化API
    • 1、反序列化Java对象
    • 2、反序列化List集合
    • 3、反序列化Map集合(带泛型)
  • 四、SerializerFeature枚举
    • 1、默认字段为null的不显示
    • 2、格式化
  • 五、@JSonField注解
  • 六、@ JSonType注解

一、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对象

@Test public void objectToJson(){     Student student = new Student();     student.setId(1);     student.setName("张三");     student.setAge(20);     student.setAddress("北京市");     String jsonString = JSON.toJSONString(student);     System.out.println(jsonString); } 结果: {"address":"北京市","age":20,"id":1,"name":"张三"} 

2、序列化List集合

@Test public void listToJson(){     Student student = new Student();     student.setId(1);     student.setName("张三");     student.setAge(20);     student.setAddress("北京市");      Student student2 = new Student();     student2.setId(2);     student2.setName("李四");     student2.setAge(22);     student2.setAddress("天津市");      List list = new ArrayList<>();     list.add(student);     list.add(student2);     String jsonString = JSON.toJSONString(list);     System.out.println(jsonString); } 结果: [{"address":"北京市","age":20,"id":1,"name":"张三"},{"address":"天津市","age":22,"id":2,"name":"李四"}] 

3、序列化Map集合

@Test public void mapToJson(){     Student student = new Student();     student.setId(1);     student.setName("张三");     student.setAge(20);     student.setAddress("北京市");      Student student2 = new Student();     student2.setId(2);     student2.setName("李四");     student2.setAge(22);     student2.setAddress("天津市");      Map map = new HashMap<>();     map.put("s1",student);     map.put("s2",student2);     String jsonString = JSON.toJSONString(map);     System.out.println(jsonString);  } 结果: {"s1":{"address":"北京市","age":20,"id":1,"name":"张三"},"s2":{"address":"天津市","age":22,"id":2,"name":"李四"}} 

三、FashJson反序列化API

1、反序列化Java对象

@Test public void jsonToObject(){     String jsonString = "{\"address\":\"北京市\",\"age\":20,\"id\":1,\"name\":\"张三\"}";     Student student = JSON.parseObject(jsonString, Student.class);     System.out.println(student); } 结果: Student(id=1, name=张三, age=20, address=北京市) 

2、反序列化List集合

@Test public void jsonToList(){     String jsonString = "[{\"address\":\"北京市\",\"age\":20,\"id\":1,\"name\":\"张三\"},{\"address\":\"天津市\",\"age\":22,\"id\":2,\"name\":\"李四\"}]";     List list = JSON.parseArray(jsonString,Student.class);     for (int i = 0; i < list.size(); i++) {         Student student =  list.get(i);         System.out.println(student);     } } 结果: Student(id=1, name=张三, age=20, address=北京市) Student(id=2, name=李四, age=22, address=天津市) 

3、反序列化Map集合(带泛型)

  • new TypeReference(){}
    • TypeReference构造方法是protected,不可直接访问(不是子类,也不再同一个包下)
    • new 对象(){} 是匿名内部类,TypeReference的子类,new的是子类而非TypeReference
@Test public void jsonToMap(){     String jsonString = "{\"s1\":{\"address\":\"北京市\",\"age\":20,\"id\":1,\"name\":\"张三\"},\"s2\":{\"address\":\"天津市\",\"age\":22,\"id\":2,\"name\":\"李四\"}}";     Map parse = JSON.parseObject(jsonString,new TypeReference>(){});      for(String s : parse.keySet()){         System.out.println(s + ":::"+parse.get(s));     } } 结果: s1:::Student(id=1, name=张三, age=20, address=北京市) s2:::Student(id=2, name=李四, age=22, address=天津市) 

四、SerializerFeature枚举

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

@Test public void testDefault(){     Student student = new Student();     student.setId(1);     student.setName(null);     student.setAge(20);   //student.setAddress("北京市");     student.setDate(new Date());     String jsonString = JSON.toJSONString(student);     System.out.println(jsonString); } 结果: {"age":20,"date":1684245428959,"id":1} 
  • 枚举常量WriteMapNullValue序列化为null的字段
@Test public void testSerializerFeature(){     Student student = new Student();     student.setId(1);     student.setName(null);     student.setAge(20);     //student.setAddress("北京市");     String jsonString = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);     System.out.println(jsonString); } 结果: {"address":null,"age":20,"id":1,"name":null} 
  • 枚举常量WriteNullStringAsEmpty字段为null,序列化为""
@Test public void testSerializerFeature(){     Student student = new Student();     student.setId(1);     student.setName(null);     student.setAge(20);     //student.setAddress("北京市");     String jsonString = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);     System.out.println(jsonString); } 结果: {"address":"","age":20,"id":1,"name":""} 
  • 枚举常量WriteNullNumberAsZero字段为null,序列化为0
  • 枚举常量WriteNullBooleanAsFalse字段值为null,输出false

2、格式化

  • 枚举常量PrettyFormat格式化输出(为了好看)
  • 枚举常量WriteDateUseDateFormat格式化日期格式
@Test public void testSerializerFeature() {     Student student = new Student();     student.setId(1);     student.setName("张三");     student.setAge(20);     student.setDate(new Date());          String jsonString = JSON.toJSONString(student,      SerializerFeature.WriteDateUseDateFormat,      SerializerFeature.PrettyFormat);          System.out.println(jsonString); } 结果: { 	"age":20, 	"date":"2023-05-16 21:54:20", 	"id":1, 	"name":"张三" } 

五、@JSonField注解

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

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

六、@ JSonType注解

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

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

相关内容

热门资讯

截至发稿!中至有挂吗,潮汕木虱... 截至发稿!中至有挂吗,潮汕木虱有辅助挂吗(真是真的是有工具)-哔哩哔哩所有人都在同一条线上,像星星一...
来临!掌中乐游戏中心脚本,瓜瓜... 来临!掌中乐游戏中心脚本,瓜瓜丰城双剑旧版攻略(竟然是有挂)-哔哩哔哩进入游戏-大厅左侧-新手福利-...
无独有偶!菠萝神辅助器app,... 无独有偶!菠萝神辅助器app,粤友会辅助(都是是真的插件)-哔哩哔哩1、超多福利:超高返利,海量正版...
受玩家影响!兴动游戏辅助器,老... 受玩家影响!兴动游戏辅助器,老友广东辅助工具下载地址(本来有挂脚本)-哔哩哔哩;老友广东辅助工具下载...
现就发布提示!wepoker辅... 现就发布提示!wepoker辅助工具,荆州晃晃辅助(确实存在有器)-哔哩哔哩wepoker辅助工具透...
今年以来!新西部大厅辅助器,衡... 今年以来!新西部大厅辅助器,衡阳丫丫字牌靠谱吗(原来是真的软件)-哔哩哔哩一、衡阳丫丫字牌靠谱吗游戏...
有消息称!乐平讨赏挂,宝宝浙江... 有消息称!乐平讨赏挂,宝宝浙江游戏有挂吗(其实是有app)-哔哩哔哩1、任何宝宝浙江游戏有挂吗透视是...
据通报!福建宁德麻将辅助软件,... 据通报!福建宁德麻将辅助软件,微乐小程序辅助器免费(总是存在有平台)-哔哩哔哩1、微乐小程序辅助器免...
为了进一步!四川长牌辅助工具教... 为了进一步!四川长牌辅助工具教程,福建天天开心辅助器是真的吗(竟然存在有挂)-哔哩哔哩1、起透看视 ...
受玩家影响!爱玩联盟脚本,陕西... 受玩家影响!爱玩联盟脚本,陕西挖坑技巧(都是是有下载)-哔哩哔哩暗藏猫腻,小编详细说明陕西挖坑技巧破...