Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

ZonedDateTime反序列化报错 #980

@anjia0532

Description

@anjia0532

我清楚如果不涉及到跨时区,用LocalDateTime会更容易,但是现有系统设计时就用了ZonedDateTime

public class VO{
    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    private ZonedDateTime modifyTime=ZonedDateTime .now();
    //...getter/setter
}
System.err.println(JSON.toJSONString(new VO())); //{"modifyTime": "2017-01-04 13:21:39"} 输出的是东八区,也就是按照@JSONField输出本地时区的日期时间

但是反序列化就不行了

JSON.parseObject("{'modifyTime': '2017-01-04 13:21:39'}", VO.class);

Exception in thread "main" com.alibaba.fastjson.JSONException: Text '2017-01-04 13:21:39' could not be parsed at index 10
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:643)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:339)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:243)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:456)
	at demo.main(demo.java:179)
Caused by: java.time.format.DateTimeParseException: Text '2017-01-04 13:21:39' could not be parsed at index 10
	at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
	at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
	at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
	at java.time.ZonedDateTime.parse(ZonedDateTime.java:582)
	at com.alibaba.fastjson.parser.deserializer.Jdk8DateCodec.deserialze(Jdk8DateCodec.java:95)
	at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:66)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:722)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:568)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:187)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:183)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:639)
	... 4 more

JSON.parseObject("{'modifyTime': '2017-01-04 13:21:39'}", Appointment.class);

https://github.com/alibaba/fastjson/blob/master/src/main/java/com/alibaba/fastjson/parser/deserializer/Jdk8DateCodec.java#L64-L97

在Jdk8DateCodec中只对LocalDateTime进行了特殊处理,ZonedDateTime仅仅是ZonedDateTime.parse(text);

需要传入 类似 2017-01-04T13:21:39.005+08:00[Asia/Shanghai] 格式的才行,否则统统异常

jackson可以注册一个全局的类型,进行处理

@Configuration
public class JacksonConfiguration {

    public static final DateTimeFormatter ISO_FIXED_FORMAT =
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Shanghai"));

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
    	ObjectMapper objectMapper=new ObjectMapper();
    	objectMapper.registerModule(new JavaTimeModule());
        return jackson2ObjectMapperBuilder -> jackson2ObjectMapperBuilder.serializers(new ZonedDateTimeSerializer(ISO_FIXED_FORMAT));
    }
}

在FastJson中有 JSON.parseObject(input, clazz, config, features)方法进行处理,但是,

ParserConfig config=new ParserConfig();
config.getDerializers().put(ZonedDateTime.class,  DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Shanghai")));

会报错,因为,value是ObjectDeserializer类型的

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions