[alibaba/fastjson]如何反序列化10位秒级时间戳

2025-10-31 847 views
7

调用第三方接口时,对方返回秒级别时间戳,能否在fastjson层面解决这个问题,目前在javabean的setter中做了特殊处理,但这并不优雅,fastjson是否有feature,或者可以通过拦截器的形式处理?曾经查询过文档,看到了ParseProcess,但是我这里由于是嵌套泛型,用到了TypeReference,没有可选的parseObject方法,最后给一个我目前的解决方式作为参考

    public static final long MAX_TIME_STAMP = 10000_000_000L;
    public void setCreateTime(long createTime) {
        if(createTime < Constants.MAX_TIME_STAMP){
            createTime *= 1000;
        }
        this.createTime = new Date(createTime);
    }

回答

3

这个第三方接口估计是用PHP或者别的生成10位时间戳语言写的。

9

能提供具体JSON样本么?

1

能提供具体JSON样本么?

字段太多,抽取两个典型的,domain如下

@Data
public class Order {

    private Date createTime;

    private Date updateTime;
}

反序列化后的时间是1970年的,因为是10位秒级时间戳

        String text = "[{\"createTime\":1548166745,\"updateTime\":1548166745}]";

        List<Order> orders = JSONObject.parseObject(text, new TypeReference<List<Order>>() {});
9

https://github.com/alibaba/fastjson/releases/tag/1.2.56 问题已解决,请用新版本。

@Data
public class Order {
    @JSOField(format="unixtime")
    public Date createTime;
    @JSOField(format="unixtime")
    public Date updateTime;
}
6

https://github.com/alibaba/fastjson/releases/tag/1.2.56 问题已解决,请用新版本。

@Data
public class Order {
    @JSOField(format="unixtime")
    public Date createTime;
    @JSOField(format="unixtime")
    public Date updateTime;
}

@JSOField(format="unixtime")是不是需要改成 > @JSONField(format="unixtime")