首页 > 其他分享 >FastJson详解

FastJson详解

时间:2024-07-17 16:54:32浏览次数:13  
标签:FastJson jsonString 20 student 详解 Student 序列化 name

文章目录

一、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<Student> 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<String,Student> 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<Student> 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<T>(){}
    • 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<String,Student> parse = JSON.parseObject(jsonString,new TypeReference<Map<String,Student>>(){});

    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序列化时的特性定义

标签:FastJson,jsonString,20,student,详解,Student,序列化,name
From: https://blog.csdn.net/qq_35512802/article/details/130714421

相关文章

  • 以电商、消费行业为例,详解火山引擎数智平台如何应用湖仓一体架构
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群。 随着互联网的不断发展,企业数据的使用场景也发生巨大变化,湖仓一体逐渐成为一种被广泛应用的底层数据架构。 详细来说,湖仓一体架构是一种将数据湖和数据仓库的优势结合起来的新型数据架......
  • SIP消息结构详解
    SIP协议的消息由三部分构成,分别是起始行(请求行+状态行)、消息头和消息体(正文)一.起始行1.请求消息起始行 起始行:由方法名、请求URI和协议版本组成,自身内部用逗号分割,三者之间用空格分隔。例如:INVITE sip:[email protected];user=phone SIP/2.0方法名:SIP协议定义了一系列......
  • linux下使用fdisk进行磁盘分区详解
     转载:https://www.cnblogs.com/renshengdezheli/p/13941563.html目录一.前言二.关于磁盘分区的结构三.fdisk命令详解四.使用fdisk进行磁盘分区4.1磁盘分区规划4.2fdisk进行磁盘分区4.3格式化分区4.4创建挂载点/挂载目录4.5挂载分区4.6设置开机自动挂载分区......
  • 【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序【图文讲解】
     欢迎来到CILMY23的博客......
  • icacls 命令使用详解
    icacls(InteractiveCommand-LineAccessControlLists)是Windows系统中用于查看和修改文件、目录权限的命令行工具。它允许管理员或具有适当权限的用户对文件和目录的访问控制列表(ACL)进行细粒度控制。以下是icacls命令的详细使用说明及操作实例。一、icacls命令的基本语法icacls......
  • Java中的响应式编程与Reactor框架使用详解
    Java中的响应式编程与Reactor框架使用详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言响应式编程是一种面向数据流和变化传播的编程范式,它适用于处理异步数据流和事件驱动的场景。Reactor框架是在Java中实现响应式编程的强大工具,本文将深入......
  • 从基础到高级应用,详解用Python实现容器化和微服务架构
    本文分享自华为云社区《Python微服务与容器化实践详解【从基础到高级应用】》,作者:柠檬味拥抱。Python中的容器化和微服务架构实践在现代软件开发中,容器化和微服务架构已经成为主流。容器化技术使得应用程序可以在任何环境中一致运行,而微服务架构通过将应用拆分成多个独立的服务......
  • 71、Flink 的 Hybrid Source 详解
    HybridSource1.概述HybridSource解决了从异构数据源顺序读取输入以生成单个输入流的问题。示例:从S3读取前几天的有界输入,然后使用Kafka的最新无界输入,当有界文件输入完成而不中断应用程序时HybridSource会从FileSource切换到KafkaSource。在HybridSource......
  • 69、Flink 的 DataStream Connector 之 Kafka 连接器详解
    1.概述Flink提供了Kafka连接器使用精确一次(Exactly-once)的语义在Kafkatopic中读取和写入数据。目前还没有Flink1.19可用的连接器。2.KafkaSourcea)使用方法KafkaSource提供了构建类来创建KafkaSource的实例。以下代码片段展示了如何构建KafkaSource来消......
  • Fastjson的payload收集
    What无第三方依赖收集了网络上的多种payload,方便进行fuzz测试提供了自动替换payload的功能,一次性为所有payload插入rmi地址/dnslogHelp--list:以清单的形式打印,方便作为字典进行fuzz--address:服务器地址(无需rmi://前缀),如11.22.33.44/exp、eval.com/rce--dns:dnslog的地址,不同......