Skip to main content

moregeek program

一文带你快速掌握fastjson的使用_兮动人的博客-多极客编程

1. FastJson序列化API



  • 方法:JSON.toJSONString
  • 序列化 : 是指将Java对象转成json格式字符串的过程。JavaBean对象、List集合对象、Map集合 为应用最广泛的。

1.1 序列化Java对象



  • Java 中的 Student 对象 序列化 为 JSON 格式 字符串

@Test
public void objectToJson(){
Student student = new Student();
student.setId(1);
student.setName("兮动人");
student.setAge(24);
student.setAddress("深圳市");
student.setFlag(true);

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

在这里插入图片描述


{
"address":"深圳市",
"age":24,
"flag":true,
"id":1,
"name":"兮动人"

}

1.2 序列化List集合


@Test
public void listToJson(){
Student student = new Student();
student.setId(1);
student.setName("兮动人");
student.setAge(24);
student.setAddress("深圳市");
student.setFlag(true);

Student student2 = new Student();
student2.setId(2);
student2.setName("Mike");
student2.setAge(25);
student2.setAddress("北京市");
student2.setFlag(false);

List<Student> list = new ArrayList<Student>();
list.add(student);
list.add(student2);

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

在这里插入图片描述


[{
"address":"深圳市","age":24,"flag":true,
"id":1,"name":"兮动人"},{"address":"北京市","age":25,"flag":false,"id":2,"name":"Mike"}]


  • 可以观察到 JSON 默认排序是按a-z字母顺序排的

[
{
"address":"深圳市",
"age":24,
"flag":true,
"id":1,
"name":"兮动人"
},
{
"address":"北京市",
"age":25,
"flag":false,
"id":2,
"name":"Mike"
}
]

1.3 序列化Map集合


@Test
public void mapToJson(){
Student student = new Student();
student.setId(1);
student.setName("兮动人");
student.setAge(24);
student.setAddress("深圳市");
student.setFlag(true);

Student student2 = new Student();
student2.setId(2);
student2.setName("Mike");
student2.setAge(25);
student2.setAddress("北京市");
student2.setFlag(false);

Map<String,Student> map = new HashMap<String, Student>();
map.put("s1",student);
map.put("s2",student2);

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

在这里插入图片描述


{
"s1":{
"address":"深圳市",
"age":24,
"flag":true,
"id":1,
"name":"兮动人"
},
"s2":{
"address":"北京市",
"age":25,
"flag":false,
"id":2,
"name":"Mike"
}
}

2. FashJson反序列化API



  • 反序列化:JSON 格式字符串,反序列化为 Java 对象

2.1 反序列化Java对象



  • 方法:JSON.parseObject

@Test
public void jsonToObject(){
String jsonString = "{\"address\":\"深圳市\",\"age\":24,\"flag\":true,\"id\":1,\"name\":\"兮动人\"}";
Student student = JSON.parseObject(jsonString, Student.class);
System.out.println(student);
}

Student(id=1, name=兮动人, age=24, address=深圳市, flag=true)

2.2 反序列化List集合



  • 方法:JSON.parseArray

@Test
public void jsonToList(){
String jsonString = "[{\"address\":\"深圳市\",\"age\":24,\"flag\":true,\"id\":1,\"name\":\"兮动人\"}," +
"{\"address\":\"北京市\",\"age\":25,\"flag\":false,\"id\":2,\"name\":\"Mike\"}]";
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=24, address=深圳市, flag=true)
Student(id=2, name=Mike, age=25, address=北京市, flag=false)

2.3 反序列化Map集合



  • 方法:JSON.parseObject

@Test
public void jsonToMap(){
String jsonString = "{\"s1\":{\"address\":\"深圳市\",\"age\":24,\"flag\":true,\"id\":1,\"name\":\"兮动人\"}," +
"\"s2\":{\"address\":\"北京市\",\"age\":25,\"flag\":false,\"id\":2,\"name\":\"Mike\"}}";
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=24, address=深圳市, flag=true)
s2:Student(id=2, name=Mike, age=25, address=北京市, flag=false)

3. SerializerFeature枚举



  • 该枚举支持序列化的一些特性数据定义

3.1 WriteMapNullValue



  • 枚举常量 WriteMapNullValue 序列化为 null 的字段

@Test
public void testSerializerFeature(){

Student student = new Student();
student.setId(1);
student.setName("兮动人");
student.setAge(24);
// student.setAddress("深圳市");
student.setFlag(true);

String jsonString = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);
System.out.println(jsonString);
}

{"address":null,"age":24,"flag":true,"id":1,"name":"兮动人"}

3.2 WriteNullStringAsEmpty



  • 枚举常量 WriteNullStringAsEmpty 字段为null,序列化为""

String jsonString = JSON.toJSONString(student, SerializerFeature.WriteNullStringAsEmpty);

{"address":"","age":24,"flag":true,"id":1,"name":"兮动人"}

3.3 WriteNullNumberAsZero



  • 枚举常量 WriteNullNumberAsZero 字段为null,序列化为0

@Test
public void testAsZero(){
Student student = new Student();
student.setId(1);
student.setName("兮动人");
// student.setAge(24);
student.setAddress("深圳市");
student.setFlag(true);

String jsonString = JSON.toJSONString(student, SerializerFeature.WriteNullNumberAsZero);
System.out.println(jsonString);
}

{"address":"深圳市","age":0,"flag":true,"id":1,"name":"兮动人"}

3.4 WriteNullBooleanAsFalse



  • 枚举常量 WriteNullBooleanAsFalse 字段值为null 输出false

@Test
public void testAsFalse(){
Student student = new Student();
student.setId(1);
student.setName("兮动人");
student.setAge(24);
student.setAddress("深圳市");
// student.setFlag(true);

String jsonString = JSON.toJSONString(student, SerializerFeature.WriteNullBooleanAsFalse);
System.out.println(jsonString);
}

在这里插入图片描述


3.5 WriteDateUseDateFormat




  • 枚举常量 WriteDateUseDateFormat 格式化日期格式



    • 没有加属性的情况下,序列化话,日期显示的是毫秒值



@Test
public void testDateFormat(){
Student student = new Student();
student.setId(1);
student.setName("兮动人");
student.setAge(24);
student.setAddress("深圳市");
student.setFlag(true);
student.setBirthDate(new Date());

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

在这里插入图片描述



  • 加上格式化日期后:

String jsonString = JSON.toJSONString(student, SerializerFeature.WriteDateUseDateFormat);

在这里插入图片描述


3.6 PrettyFormat



  • 也可以在后面都加上枚举常量 PrettyFormat格式化输出,一目了然

String jsonString = JSON.toJSONString(student,SerializerFeature.WriteDateUseDateFormat, 
SerializerFeature.PrettyFormat);

在这里插入图片描述


4. JSonField 注解


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


1、 注解属性 : name 序列化后的名字


@Data
public class Student {

private Integer id;

@JSONField(name = "studentName")
private String name;

private Integer age;

private String address;

private boolean flag;

private Date birthDate;

}

@Test
public void testName() {
Student student = new Student();
student.setId(1);
student.setName("兮动人");
student.setAge(24);
student.setAddress("深圳市");
student.setFlag(true);
student.setBirthDate(new Date());

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

在这里插入图片描述


2、注解属性 : ordinal序列化后字段的顺序,属性值越小,顺序越靠前



  • 可以看到上面序列化话默认的顺序是按照 a-z 字幕顺序来排序的
  • 给字段设置顺序的属性值

@JSONField(name = "studentName", ordinal = 1)
private String name;
@JSONField(ordinal = 2)
private Integer age;


  • 发现 值越小,就越靠前

在这里插入图片描述


3、注解属性 : format 指定序列化后的格式


@JSONField(format = "YYYY-MM-dd")
private Date birthDate;

在这里插入图片描述


4、注解属性 : serialize 指定是否序列化该字段,默认为 true


@JSONField(serialize = false)
private String address;


  • 可以发现并没有序列化 address 字段

在这里插入图片描述


5、注解属性 : deserialize 指定是否反序列化该字段,默认为 true


6、注解属性 : serialzeFeatures 指定序列化时的特性定义



  • 这个属性的用法和上面的 SerializerFeature枚举 用法是一致的

5. JSonType 注解


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


1、注解属性 : includes 要被序列化的字段


@Data
@JSONType(includes = {"id", "name", "age"})
public class Person {
private int id;
private String name;
private int age;
private String address;
}

@Test
public void test() {
Person person = new Person();
person.setId(1);
person.setName("兮动人");
person.setAge(23);
person.setAddress("北京市");

String s = JSON.toJSONString(person);
System.out.println(s);
}


  • 可以看到并没有序列化 address 字段、

在这里插入图片描述


2、注解属性 : orders 序列化后的顺序


@Data
@JSONType(includes = {"id", "name", "age", "address"}, orders = {"name", "age", "address", "id"})
public class Person {
private int id;
private String name;
private int age;
private String address;
}

@Test
public void test() {
Person person = new Person();
person.setId(1);
person.setName("兮动人");
person.setAge(23);
person.setAddress("北京市");

String s = JSON.toJSONString(person);
System.out.println(s);
}

在这里插入图片描述


3、注解属性 : serialzeFeatures 序列化时的特性定义



  • serialzeFeatures 实现和上面案例上的枚举效果是一样的

©著作权归作者所有:来自51CTO博客作者兮动人的原创作品,请联系作者获取转载授权,否则将追究法律责任

javase案例 01——面向对象的多态、接口的综合运用案例_枫糖的博客-多极客编程

需求: 需求:面向对象思想设计一个电脑对象,可以接入2个USB设备 (鼠标,键盘:实现接入,调用独有功能,拔出) 思路 1.提供2个USB设备。(USB设备必须满足:接入和拔出的功能) 2.定义一个USB的接口(申明USB设备的规范必须是:实现接入和拔出的功能) 3.开始定义2个真实的实现类代表鼠标和键盘 4.定义一个电脑类 面向对象思想设计去实现看看 //4.组装电脑 publi

#yyds干货盘点# leetcode 热题 hot 100:删除链表的倒数第 n 个结点_灰太狼_cxh的博客-多极客编程

题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]代码实现:class Solution { public ListNode removeNthFromE

#yyds干货盘点# 面试必刷top101:缺失的第一个正整数_风的博客-多极客编程

1.简述:描述给定一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数进阶: 空间复杂度 ,时间复杂度 数据范围:-231<=nums[i]<=231-10<=len(nums)<=5*105示例1输入:[1,0,2]返回值:3示例2输入:[-2,3,4,1,5]返回值:2示例3输入:[4,5,6,8,9]返回值:12.代码实现:import java.util

源码角度了解阻塞队列之linkedblockingqueue_周杰伦本人的博客-多极客编程

源码角度了解阻塞队列之LinkedBlockingQueue 大家好 我是周杰伦本人 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏 LinkedBlockingQueue是单向链表的阻塞队列,通过它的构造方法可以知道如果不指定容量的话,这个队列的长度Integer类型的最大值,它有两个锁和两个Condition,notEmpty = takeLock.newCondition();这是正在等待获取

源码角度了解阻塞队列之arrayblockingqueue_周杰伦本人的博客-多极客编程

源码角度了解阻塞队列之ArrayBlockingQueue 关于阻塞队列的文章,之前的文章也有所介绍,今天从源码的角度再分析分析,接口是BlockingQueue,它的实现类很多, ArrayBlockingQueue数组实现的环形队列,它定义了队头指针的队尾指针,一个ReentrantLock锁和两个Condition put()方法 它的put方法: public void put(E e)

aop实现系统告警_知了一笑的博客-多极客编程

工作群里的消息怕过于安静,又怕过于频繁 一、业务背景 在开发的过程中会遇到各种各样的开发问题,服务器宕机、网络抖动、代码本身的bug等等。针对代码的bug,我们可以提前预支,通过发送告警信息来警示我们去干预,尽早处理。 二、告警的方式 1、钉钉告警 通过在企业钉钉群,添加群机器人的方式,通过机器人向群内发送报警信息。至于钉钉机器人怎么创建,发送消息的api等等,请参考官方文档 2、企业微信告警

javase案例 01——面向对象的多态、接口的综合运用案例_枫糖的博客-多极客编程

需求: 需求:面向对象思想设计一个电脑对象,可以接入2个USB设备 (鼠标,键盘:实现接入,调用独有功能,拔出) 思路 1.提供2个USB设备。(USB设备必须满足:接入和拔出的功能) 2.定义一个USB的接口(申明USB设备的规范必须是:实现接入和拔出的功能) 3.开始定义2个真实的实现类代表鼠标和键盘 4.定义一个电脑类 面向对象思想设计去实现看看 //4.组装电脑 publi

#yyds干货盘点# 前端歌谣的刷题之路-第八十题-无重复数组_前端歌谣的博客-多极客编程

前言我是歌谣 我有个兄弟 巅峰的时候排名c站总榜19 叫前端小歌谣 曾经我花了三年的时间创作了他 现在我要用五年的时间超越他 今天又是接近兄弟的一天人生难免坎坷 大不了从头再来 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷 本题目源自于牛客网 微信公众号前端小歌谣题目请补全JavaScript代码,实现一个函数,要求如下: 1. 根据输入的数字范围[start,end]和随机数个数"n"生成随

#yyds干货盘点# leetcode 热题 hot 100:删除链表的倒数第 n 个结点_灰太狼_cxh的博客-多极客编程

题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]代码实现:class Solution { public ListNode removeNthFromE

源码角度了解阻塞队列之linkedblockingqueue_周杰伦本人的博客-多极客编程

源码角度了解阻塞队列之LinkedBlockingQueue 大家好 我是周杰伦本人 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏 LinkedBlockingQueue是单向链表的阻塞队列,通过它的构造方法可以知道如果不指定容量的话,这个队列的长度Integer类型的最大值,它有两个锁和两个Condition,notEmpty = takeLock.newCondition();这是正在等待获取

源码角度了解阻塞队列之arrayblockingqueue_周杰伦本人的博客-多极客编程

源码角度了解阻塞队列之ArrayBlockingQueue 关于阻塞队列的文章,之前的文章也有所介绍,今天从源码的角度再分析分析,接口是BlockingQueue,它的实现类很多, ArrayBlockingQueue数组实现的环形队列,它定义了队头指针的队尾指针,一个ReentrantLock锁和两个Condition put()方法 它的put方法: public void put(E e)

go客户之删除_zzxiaoma的博客-多极客编程

通过id删除一条记录,先添加路由 r.HandleFunc("/cusdel", web.Cusdel)通过web.Cusdel方法进行删除 func Cusdel(w http.ResponseWriter, r *http.Request) { r.ParseForm() ids := r.Form["id"] id, _ := strconv.Atoi(ids[0]) dbdat