如何使用Gson JsonDeserializer转换日期并实现JSON转Java对象
问题描述
从服务器接收的日期格式为yyyyMMdd HH:mm:ss,需要通过Gson的JsonDeserializer将其转换为yyyy-MMM-dd HH:mm:ss格式,同时完成JSON到Java对象的转换。
示例:
- 服务器返回日期:
20230320 16:09:05 - 转换后目标格式:
2023-Mar-20 16:09:05
给定JSON数据:
{"service": 2,"userIP": "10.1.1.2.3","startDateTime": "20230321 12:55:44"}
对应的Java类:
public class TestJava { private Long service; private String userIP; private LocalDateTime startDateTime; // 省略setter和getter // 重写toString方法以匹配期望输出 @Override public String toString() { DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd HH:mm:ss", Locale.ENGLISH); return "TestJava [service=" + service + ", userIP=" + userIP + ", startDateTime=" + startDateTime.format(outputFormatter) + "]"; } // getter和setter方法 public Long getService() { return service; } public void setService(Long service) { this.service = service; } public String getUserIP() { return userIP; } public void setUserIP(String userIP) { this.userIP = userIP; } public LocalDateTime getStartDateTime() { return startDateTime; } public void setStartDateTime(LocalDateTime startDateTime) { this.startDateTime = startDateTime; } }
期望输出:
TestJava [service=2, userIP=10.1.1.2.3, startDateTime=2023-Mar-21 12:55:44]
解决方案
1. 自定义LocalDateTime反序列化器
实现JsonDeserializer<LocalDateTime>接口,处理日期字符串的解析逻辑:
import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import java.lang.reflect.Type; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class LocalDateTimeDeserializer implements JsonDeserializer<LocalDateTime> { // 服务器返回的日期格式 private static final DateTimeFormatter INPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"); @Override public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { String dateStr = json.getAsString(); // 解析字符串为LocalDateTime对象 return LocalDateTime.parse(dateStr, INPUT_FORMATTER); } }
2. 创建Gson实例并解析JSON
通过GsonBuilder注册自定义反序列化器,完成JSON到Java对象的转换:
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.time.LocalDateTime; public class Main { public static void main(String[] args) { // 注册自定义反序列化器,构建Gson实例 Gson gson = new GsonBuilder() .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeDeserializer()) .create(); // 服务器返回的JSON字符串 String json = "{\"service\": 2,\"userIP\": \"10.1.1.2.3\",\"startDateTime\": \"20230321 12:55:44\"}"; // 解析为TestJava对象 TestJava testJava = gson.fromJson(json, TestJava.class); // 输出结果 System.out.println(testJava); } }
关键说明
- 反序列化器仅负责将服务器返回的日期字符串解析为
LocalDateTime对象,格式转换在TestJava的toString方法中完成; - 格式化时指定
Locale.ENGLISH,避免月份缩写显示为中文; - 确保项目引入Gson依赖(如Maven依赖:
com.google.code.gson:gson:2.10.1)。
内容的提问来源于stack exchange,提问作者Purushothama
相关产品推荐
相关产品推荐

