JSON数据转换完全指南:序列化和反序列化实战
概述
在Java开发中,经常需要在对象和JSON字符串之间进行转换。这种转换过程在Java中被称为序列化和反序列化。序列化是指将Java对象转换为JSON字符串的过程,而反序列化则是将JSON字符串还原为Java对象的过程。
本文将详细介绍如何使用阿里巴巴开源的fastjson库完成这些操作,并展示如何自定义序列化策略以及处理日期类型数据的格式化。
环境准备
首先需要在项目中引入fastjson依赖包。推荐使用1.1.33或更高版本,同时确保项目中已包含必要的依赖。
实体类定义
创建一个用于测试的实体类,假设我们需要处理位置信息数据:
public class LocationInfo {
private String locationName;
private Float elevation;
private Float longitude;
private Float latitude;
// 必须提供getter方法,否则无法序列化
public String getLocationName() {
return locationName;
}
public void setLocationName(String locationName) {
this.locationName = locationName;
}
public Float getElevation() {
return elevation;
}
public void setElevation(Float elevation) {
this.elevation = elevation;
}
public Float getLongitude() {
return longitude;
}
public void setLongitude(Float longitude) {
this.longitude = longitude;
}
public Float getLatitude() {
return latitude;
}
public void setLatitude(Float latitude) {
this.latitude = latitude;
}
}
重要提示:fastjson在序列化时只会处理有getter方法的属性,因此实体类必须为每个需要转换的字段提供getter方法。
基础序列化与反序列化
fastjson提供了简洁的API来完成对象和JSON字符串之间的互转。
完整示例代码
import com.alibaba.fastjson.JSONObject;
public class JsonConversionDemo {
public static void main(String[] args) {
// 创建测试对象
LocationInfo location = new LocationInfo();
location.setLocationName("测试地点");
location.setElevation(100.5f);
location.setLatitude(39.9042f);
location.setLongitude(116.4074f);
// 序列化操作:将对象转换为JSON字符串
// 默认情况下,所有非空字段都会被转换为JSON
String jsonString = JSONObject.toJSONString(location);
System.out.println("序列化结果:" + jsonString);
// 反序列化操作:将JSON字符串转换为对象
LocationInfo parsedLocation = JSONObject.parseObject(
jsonString,
LocationInfo.class
);
System.out.println("反序列化后地点名称:" + parsedLocation.getLocationName());
System.out.println("反序列化后经度:" + parsedLocation.getLongitude());
}
}
上述代码的输出结果类似于:
序列化结果:{"elevation":100.5,"latitude":39.9042,"locationName":"测试地点","longitude":116.4074}
反序列化后地点名称:测试地点
反序列化后经度:116.4074
自定义序列化策略
在实际开发中,有时只需要将对象的某些特定字段转换为JSON,而不是全部字段。fastjson提供了SimplePropertyPreFilter类来实现这种需求。
选择性序列化示例
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;
public class CustomSerializationDemo {
public static void main(String[] args) {
LocationInfo location = new LocationInfo();
location.setLocationName("指定地点");
location.setElevation(200.0f);
location.setLatitude(31.2304f);
location.setLongitude(121.4737f);
// 创建过滤器,只序列化locationName和elevation两个属性
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(
LocationInfo.class,
"locationName",
"elevation"
);
String filteredJson = JSONObject.toJSONString(location, filter);
System.out.println("过滤后的JSON:" + filteredJson);
// 反序列化过滤后的JSON字符串
LocationInfo restored = JSONObject.parseObject(
filteredJson,
LocationInfo.class
);
System.out.println("恢复后的经度值:" + restored.getLongitude());
}
}
运行结果:
过滤后的JSON:{"elevation":200,"locationName":"指定地点"}
恢复后的经度值:null
可以看到,通过过滤器只有指定的字段被序列化,反序列化时未包含的字段则为null。
日期类型处理
日期是常见的数据类型,fastjson对日期处理提供了多种灵活的格式化方案。
日期序列化示例
import java.util.Date;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class DateSerializationDemo {
public static void main(String[] args) {
Date currentDate = new Date();
// 方式一:默认转换为毫秒时间戳
String timestampFormat = JSON.toJSONString(currentDate);
System.out.println("毫秒时间戳格式:" + timestampFormat);
// 方式二:使用默认日期时间格式 "yyyy-MM-dd HH:mm:ss"
String standardFormat = JSON.toJSONString(
currentDate,
SerializerFeature.WriteDateUseDateFormat
);
System.out.println("标准格式:" + standardFormat);
// 方式三:自定义日期格式
String customFormat = JSON.toJSONStringWithDateFormat(
currentDate,
"yyyy-MM-dd",
SerializerFeature.WriteDateUseDateFormat
);
System.out.println("自定义格式:" + customFormat);
}
}
输出结果示例:
毫秒时间戳格式:1704067200000
标准格式:2024-01-01 12:00:00
自定义格式:2024-01-01
总结
fastjson作为高性能的JSON处理库,提供了丰富的序列化反序列化功能。通过本文介绍的基础API、过滤器机制和日期格式化选项,开发者可以灵活应对各种JSON数据转换场景。在实际应用中,应根据具体需求选择合适的序列化策略,以达到最佳的性能和功能平衡。