上篇文章【Java】Jackson序列化案例分析:https://blog.csdn.net/AwesomeP/article/details/144726180
需求
将如下Json字符串映射在Java对象中。
{
“name”: “John Doe”,
“phone”: “1234567890”,
“age”: 30,
“birthday”: “2000-01-01 12:00:00”,
“createTime”: “2020-01-01T12:00:00”,
“isDelete”: false
}
定义如下
String userJsonStr = "{\"name\":\"John Doe\",\"phone\":\"1234567890\",\"age\":30,\"birthday\":\"2000-01-01 12:00:00\",\"createTime\":\"2020-01-01T12:00:00\",\"isDelete\":false}";
Java对象
public class UserBean {private String name;private String phone;private Integer age;private Date birthday;private LocalDateTime createTime;private Boolean isDelete;
}
通过Jackson进行反序列化
关键注解
@JsonFormat
与@JsonDeserialize
1.@JsonFormat 注解用于指定在序列化和反序列化过程中,日期和时间类型的格式化方式。它可以应用于日期、时间、以及其他需要特定格式的字段。
- pattern: 指定日期和时间的格式化模式,例如 “yyyy-MM-dd HH:mm:ss”。
- shape: 指定数据的形状,例如 JsonFormat.Shape.STRING。
- timezone: 指定时区,例如 “GMT+8” 或 “Asia/Shanghai”。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
2.@JsonDeserialize 注解用于指定自定义的反序列化器,以便在反序列化过程中使用特定的逻辑。它可以应用于类、字段或方法上。
@JsonDeserialize(using = 自定义Deserializer.class)
示例
自定义LocalDateTime的反序列化器,继承JsonDeserializer
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;/*** 自定义LocalDateTime的反序列化器* 用于将符合特定格式的字符串转换为LocalDateTime对象*/
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {// 定义一个静态常量formatter,用于日期时间的解析// 该格式器考虑了时区,使用的是GMT+8时区private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss").withZone(ZoneId.of("GMT+8"));/*** 反序列化方法,将JSON字符串转换为LocalDateTime对象** @param p JsonParser对象,用于解析输入的JSON内容* @param ctxt DeserializationContext对象,提供反序列化上下文信息* @return LocalDateTime 返回转换后的LocalDateTime对象* @throws IOException 当解析输入遇到I/O错误时抛出*/@Overridepublic LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {// 获取JSON解析器解析的文本内容String str = p.getText();// 使用定义好的格式器解析字符串为ZonedDateTime对象ZonedDateTime zonedDateTime = ZonedDateTime.parse(str, formatter);// 将ZonedDateTime对象转换为LocalDateTime对象并返回return zonedDateTime.toLocalDateTime();}
}
在实体类中添加注解
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@Data
public class UserBean {private String name;private String phone;private Integer age;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date birthday;@JsonDeserialize(using = LocalDateTimeDeserializer.class)private LocalDateTime createTime;private Boolean isDelete;
}
测试类
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;public class JsonDeserializationDemo {public static void main(String[] args) {// JSON字符串示例String userJsonStr = "{\"name\":\"John Doe\",\"phone\":\"1234567890\",\"age\":30,\"birthday\":\"2000-01-01 12:00:00\",\"createTime\":\"2020-01-01T12:00:00\",\"isDelete\":false}";// 创建ObjectMapper实例,用于JSON处理ObjectMapper objectMapper = new ObjectMapper();try {// 将JSON字符串反序列化为UserBean对象UserBean user = objectMapper.readValue(userJsonStr, UserBean.class);System.out.println(user);} catch (IOException e) {throw new RuntimeException(e);}}
}
输出:
UserBean(name=John Doe, phone=1234567890, age=30, birthday=Sat Jan 01 12:00:00 CST 2000, createTime=2020-01-01T12:00, isDelete=false)
Process finished with exit code 0