fastjson
是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
Fastjson 源码地址:https://github.com/alibaba/fastjson
Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
Person JavaBean
:package com.liming.entity;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@JSONField(name = "AGE")
private int age;
@JSONField(name = "FULL NAME")
private String fullName;
@JSONField(name = "DATE OF BIRTH")
private Date dateOfBirth;
}
JSON.toJSONString()
将 Java 对象转换换为 JSON 对象:@Test
void testToJSONString() {
// 创建集合
List<Person> personList = new ArrayList<>();
// 添加数据
Collections.addAll(personList,
new Person(15, "张三", new Date()),
new Person(21, "李四", new Date()));
// 打印数据
System.out.println(JSON.toJSONString(personList));
}
输出结果为:
[
{
"AGE": 15,
"DATE OF BIRTH": 1703215456830,
"FULL NAME": "张三"
},
{
"AGE": 21,
"DATE OF BIRTH": 1703215456830,
"FULL NAME": "李四"
}
]
我们还可以
自定义输出
,并控制字段的排序
,日期显示格式
,序列化标记
等,接下来我们更新实体类并添加几个字段:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@JSONField(name="AGE", serialize=false)
private int age;
@JSONField(name="LAST NAME", ordinal = 2)
private String lastName;
@JSONField(name="FIRST NAME", ordinal = 1)
private String firstName;
@JSONField(name="DATE OF BIRTH", format="YYYY-MM-dd HH:mm:ss", ordinal = 3)
private Date dateOfBirth;
}
以上代码中我们列出了基本参数类别,并使用 @JSONField
注解,以便实现自定义转换:
format
参数用于格式化 date 属性。serialize
指定字段不序列化。ordinal
参数指定字段的顺序使用 JSON.toJSONString()
将 Java 对象转换换为 JSON 对象:
@Test
void testToJSONString() {
// 创建集合
List<Person> personList = new ArrayList<>();
// 添加数据
Collections.addAll(personList,
new Person(15, "张", "张三", new Date()),
new Person(21, "李", "李四", new Date()));
// 打印数据
System.out.println(JSON.toJSONString(personList));
}
这样,以上输出结果为:
[
{
"FIRST NAME": "张三",
"LAST NAME": "张",
"DATE OF BIRTH": "2023-12-22 11:32:33"
},
{
"FIRST NAME": "李四",
"LAST NAME": "李",
"DATE OF BIRTH": "2023-12-22 11:32:33"
}
]
@JSONField
的作用对象:字段,方法
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才支持
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
字段上
:可以在字段上使用 @JSONField 注解来指定字段的序列化和反序列化的行为,例如:public class User {
@JSONField(name = "id")
private Long userId;
@JSONField(format = "yyyy-MM-dd")
private Date birthDate;
// getters and setters
}
方法上
:可以在 getter 或者 setter 方法上使用 @JSONField 注解来控制对应字段的序列化和反序列化行为,例如:public class User {
private Long userId;
private String username;
@JSONField(name = "id")
public Long getUserId() {
return userId;
}
@JSONField(name = "id")
public void setUserId(Long userId) {
this.userId = userId;
}
// getters and setters for other fields
}
SerializerFeature
是 Fastjson 序列化库提供的一组枚举常量
,用于配置 JSON 序列化过程中的不同特性和选项。通过在序列化时传递相应的 SerializerFeature 常量,可以根据需求自定义序列化行为。
以下是一些常用的 SerializerFeature 常量及其作用:
可以通过 JSON.toJSONString
方法的第二个参数
来传递一个 SerializerFeature 数组,以启用多个特性。例如:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class Main {
public static void main(String[] args) {
User user = new User();
user.setName("Alice");
String json = JSON.toJSONString(user,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteDateUseDateFormat);
System.out.println(json); // {"name":"Alice","birthday":""}
}
}
class User {
private String name;
private Date birthday;
// getters and setters
}
创建 JSON 对象非常简单,只需使用
JSONObject
(fastJson提供的json对象) 和JSONArray
(fastJson提供json数组对象) 对象即可。
我们可以把JSONObject 当成一个 Map<String,Object>
来看,只是 JSONObject 提供了更为丰富便捷的方法,方便我们对于对象属性的操作。我们看一下源码:
同样我们可以把 JSONArray 当做一个List<Object>
,可以把 JSONArray 看成 JSONObject 对象的一个集合,查看源码:
此外,由于
JSONObject
和JSONArray
继承了JSON
,所以说也可以直接使用两者对 JSON 格式字符串与 JSON 对象及 javaBean 之间做转换。
@Test
void testJSONArrayAndJSONObject(){
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < 2; i++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("age",21);
jsonObject.put("name","jeck"+i);
jsonObject.put("dateOfBirth","2023-12-22 12:12:12");
jsonArray.add(jsonObject);
}
System.out.println(jsonArray.toJSONString());
}
输出结果为:
[
{
"name": "jeck0",
"dateOfBirth": "2023-12-22 12:12:12",
"age": 21
},
{
"name": "jeck1",
"dateOfBirth": "2023-12-22 12:12:12",
"age": 21
}
]
我们可以使用
JSON.parseObject()
将 JSON 字符串转换为 Java 对象,代码如下:
@Test
public void testParseObject() {
Person person = new Person(20, "张", "张三", new Date());
String jsonObject = JSON.toJSONString(person);
Person newPerson = JSON.parseObject(jsonObject, Person.class);
System.out.println(newPerson);
}
输出结果为: