fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] 当有 provider::register 类型处理后,@JSONField 注解失效了

Open noear opened this issue 1 year ago • 5 comments

在 fastjson1 里是不会失效的;在 jackjson 里可通过代码不失效。。。以下为复现代码:

public class FormatTest {
    public static void main(String[] args){
        //
        // 当有 Provider::register 类型处理后,@JSONField 注解失效了
        //
        JSONWriter.Context context = new JSONWriter.Context();
        context.getProvider().register(Date.class, new ObjectWriter() {
            @Override
            public void write(JSONWriter jsonWriter, Object o, Object o1, Type type, long l) {
                jsonWriter.writeInt64(((Date)o).getTime());
            }
        });

        CustomDateDo dateDo = new CustomDateDo();

        dateDo.setDate(new Date(1673861993477L));
        dateDo.setDate2(new Date(1673861993477L));

        String json =  JSON.toJSONString(dateDo, context);
        System.out.println(json); //{"date":1673861993477,"date2":1673861993477}

        assert "{\"date\":1673861993477,\"date2\":\"2023-01-16 17:39:53\"}".equals(json);
    }

    public static class CustomDateDo {
        private Date date;

        @JSONField(format = "yyyy-MM-dd HH:mm:ss")
        private Date date2;

        public void setDate(Date date) {
            this.date = date;
        }

        public void setDate2(Date date2) {
            this.date2 = date2;
        }

        public Date getDate() {
            return date;
        }

        public Date getDate2() {
            return date2;
        }
    }
}

noear avatar Sep 04 '24 09:09 noear

目前的机制,是无法支持自定义ObjectReader/ObjectWriter时处理Annotation。你可以在Annotation上设置JSONField(format="millis"),或者在JSONWriter.Context上配置format="millis"

wenshao avatar Sep 10 '24 01:09 wenshao

@wenshao 那是不是能在定制时,拿到注解信息???这样可以在定制时,支持注解的能力。。。目前 jackson 是这么搞的;

或者在定制之前,先完成注解的效果(类型可能会转变),再转给对应的类型处理。。。我的 json 框架是这么搞的。

noear avatar Sep 10 '24 01:09 noear

是的,你可以看下Mixin的机制是否对你有用 https://github.com/alibaba/fastjson2/blob/main/docs/mixin_cn.md

wenshao avatar Sep 10 '24 01:09 wenshao

@wenshao 这个估计不合适。。。1. 体验不自然;2.需要用户介入;3.有大量实体时,可行性弱

noear avatar Sep 10 '24 01:09 noear

JSONWriter.Context context = new JSONWriter.Context();
context.setDateFormat("millis");

用这个实现

wenshao avatar Sep 15 '24 08:09 wenshao