Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用ObjectWriter自定义处理的时候,使用接口类型的情况下无法被调用 #1699

Closed
eimlfang opened this issue Jul 29, 2023 · 3 comments
Labels
fixed question Further information is requested
Milestone

Comments

@eimlfang
Copy link

eimlfang commented Jul 29, 2023

使用ObjectWriter自定义处理的时候,使用接口类型的情况下无法被调用

与相似问题有一样的前提条件,定义了一个接口给枚举使用

fastJSON版本:
2.0.37

public interface MapEnum {
    @JSONField
    String getCode();
    String getDesc();
}

如果添加了@JSONField,可以将code里的写入JSON中,但是如果我想要特别定制,将MapEnum做为一个对象写入,我定义了一个ObjectWriter, 并注册

JSON.register(MapEnum.class, new ObjectWriter<MapEnum>() {
            @Override
            public void write(JSONWriter jsonWriter,
                              Object object, Object fieldName,
                              Type fieldType,
                              long features) {
                Map<String, Object> map = new HashMap<>();
                map.put("code", ((MapEnum) object).getCode());
                map.put("desc", ((MapEnum) object).getDesc());
                jsonWriter.write(map);

            }
        });

如果这样注册,当类中的字段为MapEnum的实现的时候,序列化无效,当我使用比如:

        testCls.setMapEnum(new MapEnum() {
            @Override
            public String getCode() {
                return "hahaha";
            }

            @Override
            public String getDesc() {
                return "This is what";
            }
        });

刻意将字段设置成接口,则有效,请问这个情况,是我的调用问题,还是一个Bug?

@eimlfang eimlfang added the question Further information is requested label Jul 29, 2023
@wenshao
Copy link
Member

wenshao commented Jul 29, 2023

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.38-SNAPSHOT/
请用2.0.38-SNAPSHOT版本帮忙做如下验证:

    @Test
    public void test() {
        assertEquals("{\"code\":\"Big\",\"desc\":\"\"}", JSON.toJSONString(MyEnum.Big));
    }

    @JSONType(writeEnumAsJavaBean = true)
    public interface MapEnum {
        String getCode();
        String getDesc();
    }

    public enum MyEnum
            implements MapEnum {
        Big("Big", "大"),
        Small("Small", "小");

        MyEnum(String code, String desc) {
            this.code = code;
            this.desc = desc;
        }

        final String code;
        final String desc;

        @Override
        public String getCode() {
            return code;
        }

        @Override
        public String getDesc() {
            return desc;
        }
    }

@eimlfang
Copy link
Author

eimlfang commented Aug 1, 2023

@wenshao 你好,验证可以通过,版本:2.0.38-SNAPSHOT

@wenshao wenshao added the fixed label Aug 13, 2023
@wenshao wenshao added this to the 2.0.39 milestone Aug 13, 2023
@wenshao
Copy link
Member

wenshao commented Aug 15, 2023

@wenshao wenshao closed this as completed Aug 15, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
fixed question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants