You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:08:27