FastJson
格式转换
导入坐标
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
</dependencies>
创建实体类
package com.qr;
import lombok.Data;
import java.util.Date;
/**
* FastJson
*/
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
private Date bitrthday;
}
测试
package com.qr;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import org.junit.Test;
import java.util.*;
public class FastJsonTest {
/**
* java对象转为json格式的字符串
*/
@Test
public void testObjectToJson(){
Student student = new Student();
student.setId(1);
student.setName("list");
student.setAge(11);
student.setBitrthday(new Date());
//转化
String jsongString = JSON.toJSONString(student);
System.out.println(jsongString);
//{"age":11,"bitrthday":1620137932283,"id":1,"name":"list"}
}
/**
* java中的集合转换为json
*/
@Test
public void testListToJson() {
List<Student> list = new ArrayList<Student>();
Student student1 = new Student();
student1.setId(1);
student1.setName("list");
student1.setAge(11);
student1.setBitrthday(new Date());
Student student2 = new Student();
student2.setId(2);
student2.setName("lisa");
student2.setAge(12);
student2.setBitrthday(new Date());
list.add(student1);
list.add(student2);
//list集合序列华为json格式的字符串
String s = JSON.toJSONString(list);
System.out.println(s);
//[{"age":11,"bitrthday":1620138289599,"id":1,"name":"list"},{"age":12,"bitrthday":1620138289599,"id":2,"name":"lisa"}]
}
/**
* map集合
*/
@Test
public void testMapToJson(){
Map<String,Student> map = new HashMap<String, Student>();
Student student1 = new Student();
student1.setId(1);
student1.setName("list");
student1.setAge(11);
student1.setBitrthday(new Date());
Student student2 = new Student();
student2.setId(2);
student2.setName("lisa");
student2.setAge(12);
student2.setBitrthday(new Date());
//map集合存储对象
map.put("stu1",student1);
map.put("stu2",student2);
String s = JSON.toJSONString(map);
System.out.println(s);
// {"stu2":{"age":12,"bitrthday":1620138549606,"id":2,"name":"lisa"},
// "stu1":{"age":11,"bitrthday":1620138549606,"id":1,"name":"list"}}
}
/**
* 反序列化
*/
/**
* json 反序列化为 java对象
*/
@Test
public void testJsonToObject(){
String json = "{\"age\":11,\"bitrthday\":1620137932283,\"id\":1,\"name\":\"list\"}";
Student student = JSON.parseObject(json, Student.class);
System.out.println(student);
//Student(id=1, name=list, age=11, bitrthday=Tue May 04 22:18:52 CST 2021)
}
/**
* json 反序列化为 list集合
*/
@Test
public void testJsonToList(){
String json = "[{\"age\":11,\"bitrthday\":1620138289599,\"id\":1,\"name\":\"list\"},{\"age\":12,\"bitrthday\":1620138289599,\"id\":2,\"name\":\"lisa\"}]";
List<Student> list = JSON.parseArray(json, Student.class);
list.forEach(System.out::println);
/**
* Student(id=1, name=list, age=11, bitrthday=Tue May 04 22:24:49 CST 2021)
* Student(id=2, name=lisa, age=12, bitrthday=Tue May 04 22:24:49 CST 2021)
*/
}
@Test
public void testJsonToMap(){
String json = "{\"stu2\":{\"age\":12,\"bitrthday\":1620138549606,\"id\":2,\"name\":\"lisa\"},\"stu1\":{\"age\":11,\"bitrthday\":1620138549606,\"id\":1,\"name\":\"list\"}}";
//直接反序列化是没有泛型的,转不过去,没有泛型的集合是不安全的
// Map jsonObject = JSON.parseObject(json);
//传入转后的map集合,最后部分需要添加一个括号{}
Map<String, Student> map = JSON.parseObject(json, new TypeReference<Map<String, Student>>(){});
for (String key:map.keySet()){
System.out.println(key+":"+map.get(key));
}
/**
* stu2:Student(id=2, name=lisa, age=12, bitrthday=Tue May 04 22:29:09 CST 2021)
* stu1:Student(id=1, name=list, age=11, bitrthday=Tue May 04 22:29:09 CST 2021)
*/
}
}
枚举
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
private Date bitrthday;
//添加一个布尔值
private Boolean flag;
}
package com.qr;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.junit.Test;
import java.util.Date;
/**
* SerializerFeature枚举:
* 进行序列化的时候,可以自定义特殊需求
*
*/
public class FastJsonTest2 {
/**
* 序列化为null值的字段
* WriteMapNullValue
*/
@Test
public void testWriteMapNullValue(){
Student student = new Student();
student.setId(1);
student.setName("zhangsan");
student.setAge(20);
// String s = JSON.toJSONString(student);
// System.out.println(s);
//{"age":20,"id":1,"name":"zhangsan"},空值是没有被序列化的
//SerializerFeature.WriteMapNullValue
String s = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);
System.out.println(s);
//{"age":20,"bitrthday":null,"id":1,"name":"zhangsan"}
}
/**
* 序列化为null的字段,序列化为""
*/
@Test
public void testWriteNullStringEnpty(){
Student student = new Student();
student.setId(1);
student.setAge(20);
String s = JSON.toJSONString(student,SerializerFeature.WriteNullStringAsEmpty);
System.out.println(s);
//{"age":20,"bitrthday":null,"id":1,"name":""}
}
/**
* 序列化为null的number为0
*/
@Test
public void testWriteNullNumberAsZero(){
Student student = new Student();
student.setId(1);
student.setName("zhangsan");
// student.setAge(20);
student.setBitrthday(new Date());
String s = JSON.toJSONString(student,SerializerFeature.WriteNullNumberAsZero);
System.out.println(s);
//{"age":0,"bitrthday":1620141333809,"id":1,"name":"zhangsan"}
}
/**
* WriteNullBooleanAsFalse枚举常量,boolean值为null,序列化为false
*/
@Test
public void testWriteNullBooleanAsFalse(){
Student student = new Student();
student.setId(1);
student.setName("zhangsan");
student.setAge(20);
student.setBitrthday(new Date());
student.setFlag(true);
String s = JSON.toJSONString(student,SerializerFeature.WriteNullBooleanAsFalse);
System.out.println(s);
//{"age":20,"bitrthday":1620141727099,"flag":true,"id":1,"name":"zhangsan"}
}
/**
* 序列化日期格式化
*
*/
@Test
public void testWriteDateUseDateFormatPrettyFormat(){
Student student = new Student();
student.setId(1);
student.setName("zhangsan");
student.setAge(20);
student.setBitrthday(new Date());
student.setFlag(true);
String s = JSON.toJSONString(student,SerializerFeature.WriteDateUseDateFormat);
System.out.println(s);
//{"age":20,"bitrthday":"2021-05-04 23:25:57","flag":true,"id":1,"name":"zhangsan"}
String s2 = JSON.toJSONString(student,SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.PrettyFormat);
System.out.println(s2);
/**
* {
* "age":20,
* "bitrthday":"2021-05-04 23:27:20",
* "flag":true,
* "id":1,
* "name":"zhangsan"
* }
*/
}
}
注解
JSONField
package com.qr;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.Date;
/**
* FastJson
*/
@Data
public class Student {
private Integer id;
//注解属性
@JSONField(name = "studentName",ordinal = 1)
private String name;
@JSONField(ordinal = 2,serialize = false)
private Integer age;
@JSONField(format = "yyyy-MM-dd")
private Date bitrthday;
//添加一个布尔值
private Boolean flag;
}
package com.qr;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.junit.Test;
import java.util.Date;
/**
* JSONFeild注解:
* 该注解作用于方法上,字段和参数上,可在序列化和反序列时进行特定功能定制
*/
public class FastJsonTest3 {
/**
* 序列化的时候可以做到修改属性名
*/
@Test
public void testObjectToJson(){
Student student = new Student();
student.setId(1);
student.setName("list");
student.setAge(11);
student.setBitrthday(new Date());
student.setFlag(true);
String jsongString = JSON.toJSONString(student);
System.out.println(jsongString);
/**
* //注解属性
* @JSONField(name = "studentName")
* private String name;
*
* {"age":11,"bitrthday":1620142567227,"flag":true,"id":1,"studentName":"list"}
*/
/**
* 可以改变出现的位置
* @JSONField(name = "studentName",ordinal = 1)
* private String name;
* @JSONField(ordinal = 2)
* private Integer age;
* 注解的顺序可以进行调整
* {"bitrthday":1620142775049,"flag":true,"id":1,"studentName":"list","age":11}
*/
/**
* @JSONField(format = "yyyy-MM-dd")
* private Date bitrthday;
* {"bitrthday":"2021-05-04","flag":true,"id":1,"studentName":"list","age":11}
*/
/**
* @JSONField(ordinal = 2,serialize = false)指定false就不会进行序列化
* private Integer age;
* {"bitrthday":"2021-05-04","flag":true,"id":1,"studentName":"list"}
*/
}
}
JSONType
@Data
//includes指的是要被序列化的字段
@JSONType(includes = {"id","age","address"})
public class Person {
private Integer id;
private String name;
private Integer age;
private String address;
}
/**
* JSONType注解:
* 该注解作用于方法上,字段和参数上,可在序列化和反序列时进行特定功能定制
*/
public class FastJsonTest4 {
@Test
public void test(){
Person person = new Person();
person.setId(1);
person.setName("aa");
person.setAge(11);
person.setAddress("浙江杭州");
String s = JSON.toJSONString(person);
System.out.println(s);
//{"address":"浙江杭州","age":11,"id":1}name没有被序列化
}
}
@Data
//includes指的是要被序列化的字段
//orders明确序列化后的顺序
@JSONType(includes = {"id","name","age","address"},orders = {"name","address","age","id"})
public class Person {
private Integer id;
private String name;
private Integer age;
private String address;
}
public class FastJsonTest4 {
@Test
public void test(){
Person person = new Person();
person.setId(1);
person.setName("aa");
person.setAge(11);
person.setAddress("浙江杭州");
String s = JSON.toJSONString(person);
System.out.println(s);
//{"name":"aa","address":"浙江杭州","age":11,"id":1}
}
}