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

Java中直接反序列化单个JSON日期字符串的实现方法(无需创建实体类)

嘿,这个问题我刚好有经验!在Java里要实现像C#那样直接把单个特殊JSON日期字符串反序列化为日期类型,完全不用创建实体类,我给你两种实用方案参考:

方案1:手动解析字符串(无需第三方库)

这种方式适合不想引入额外依赖的场景,我们可以用正则表达式提取字符串里的时间戳和时区偏移,然后直接构造日期对象:

import java.time.ZonedDateTime;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ManualDateParser {
    public static void main(String[] args) {
        String jsonDate = "/Date(1630050818893+0300)/";
        
        // 用正则匹配提取时间戳和时区偏移
        Pattern datePattern = Pattern.compile("/Date\\((\\d+)([+-]\\d{4})\\)/");
        Matcher matcher = datePattern.matcher(jsonDate);
        
        if (matcher.find()) {
            // 提取毫秒级时间戳
            long timestamp = Long.parseLong(matcher.group(1));
            // 提取时区偏移(比如+0300)
            String zoneOffset = matcher.group(2);
            
            // 构造带时区的日期对象(Java 8+推荐用ZonedDateTime)
            ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(
                java.time.Instant.ofEpochMilli(timestamp),
                java.time.ZoneId.of("GMT" + zoneOffset)
            );
            
            System.out.println("解析后的带时区日期:" + zonedDateTime);
            
            // 如果需要转换成旧的java.util.Date类型
            java.util.Date legacyDate = java.util.Date.from(zonedDateTime.toInstant());
            System.out.println("转换为旧Date类型:" + legacyDate);
        } else {
            System.err.println("日期格式不匹配,请检查输入字符串");
        }
    }
}
方案2:用Jackson实现类似C#的一行反序列化(推荐)

如果你习惯用JSON库处理,Jackson可以实现和C#几乎一样的简洁写法。首先需要添加Jackson的依赖(以Maven为例):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 建议使用最新稳定版 -->
</dependency>

然后我们需要自定义一个反序列化器,让Jackson能识别这种Microsoft风格的日期格式,之后就能像C#那样一行代码完成反序列化:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.io.IOException;
import java.time.ZonedDateTime;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JacksonDateDeserializerExample {
    public static void main(String[] args) throws IOException {
        String jsonDate = "/Date(1630050818893+0300)/";
        
        // 创建自定义反序列化器,处理特殊日期格式
        SimpleModule customDateModule = new SimpleModule();
        customDateModule.addDeserializer(ZonedDateTime.class, new JsonDeserializer<ZonedDateTime>() {
            private final Pattern datePattern = Pattern.compile("/Date\\((\\d+)([+-]\\d{4})\\)/");
            
            @Override
            public ZonedDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException {
                String dateStr = parser.getText();
                Matcher matcher = datePattern.matcher(dateStr);
                
                if (matcher.find()) {
                    long timestamp = Long.parseLong(matcher.group(1));
                    String zoneOffset = matcher.group(2);
                    return ZonedDateTime.ofInstant(
                        java.time.Instant.ofEpochMilli(timestamp),
                        java.time.ZoneId.of("GMT" + zoneOffset)
                    );
                }
                throw new IOException("无法解析日期字符串:" + dateStr);
            }
        });
        
        // 配置ObjectMapper,注册自定义模块和Java 8时间模块
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule()); // 支持Java 8时间类型
        mapper.registerModule(customDateModule);
        
        // 一行代码完成反序列化,和C#的写法几乎一致!
        ZonedDateTime dateTime = mapper.readValue(jsonDate, ZonedDateTime.class);
        System.out.println("反序列化后的日期:" + dateTime);
        
        // 如果需要转换成java.util.Date
        java.util.Date legacyDate = mapper.readValue(jsonDate, java.util.Date.class);
        System.out.println("转换为旧Date类型:" + legacyDate);
    }
}

两种方案都能完美处理你提供的/Date(1630050818893+0300)/格式,你可以根据项目需求选择合适的方式~

内容的提问来源于stack exchange,提问作者Navnetsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:07:30