alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.74k stars 484 forks source link

对象序列化后属性名被修改(驼峰转换错误) #1019

Open xiongzegang opened 1 year ago

xiongzegang commented 1 year ago

版本2.0.21 重现代码: @Data public class MyUser {

private String oAuthName;

private Integer age;

public static void main(String[] args) {
    MyUser myUser = new MyUser();
    myUser.setOAuthName("xiong");
    myUser.setAge(25);
    System.out.println(JSON.toJSONString(myUser));
    // 期望输出为: {"oAuthName":"xiong","age":25}
    // 实际输出为: {"OAuthName":"xiong","age":25}
}

}

wenshao commented 1 year ago

这个是java bean规范,java.beans.Introspector#decapitalize方法的行为一致。你可以通过JSONField定制输出的字段名:

    @Test
    public void test() {
        Bean bean = new Bean();
        bean.age = 20;
        bean.oAuthName = "xxx";
        String str = JSON.toJSONString(bean);
        assertEquals("{\"age\":20,\"oAuthName\":\"xxx\"}", str);
    }

    @Data
    static class Bean {
        @JSONField(name = "oAuthName")
        private String oAuthName;
        private Integer age;
    }
xiongzegang commented 1 year ago

这个是java bean规范,java.beans.Introspector#decapitalize方法的行为一致。你可以通过JSONField定制输出的字段名:

    @Test
    public void test() {
        Bean bean = new Bean();
        bean.age = 20;
        bean.oAuthName = "xxx";
        String str = JSON.toJSONString(bean);
        assertEquals("{\"age\":20,\"oAuthName\":\"xxx\"}", str);
    }

    @Data
    static class Bean {
        @JSONField(name = "oAuthName")
        private String oAuthName;
        private Integer age;
    }

你好,这是我从fastjson切换到fastjson2发现的问题,之前使用fastjson序列化spring oauth2 token,发现的这种不同之处,因为被序列化的对象的spring框架的类,我不能去指定这个注解。这算是fastjson2和fastjson不兼容的地方吧

wenshao commented 1 year ago

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson/2.0.22-SNAPSHOT/ 问题已经修复,使用兼容API保持原来的命名风格输出,请帮忙用2.0.22-SNAPSHOT版本验证,2.0.22版本预计在元旦期间发布

xiongzegang commented 1 year ago

@wenshao 你好,使用https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson/2.0.22-SNAPSHOT/和相同的测试代码依然没有得到fastjson原来的命名风格输出。

wenshao commented 1 year ago

@xiongzegang 这样用:

    @Test
    public void test1() {
        ObjectWriterProvider provider = new ObjectWriterProvider(PropertyNamingStrategy.CamelCase1x);

        Bean1 bean = new Bean1();
        bean.age = 20;
        bean.oAuthName = "xxx";
        String str = JSON.toJSONString(bean, JSONFactory.createWriteContext(provider));
        assertEquals("{\"age\":20,\"oAuthName\":\"xxx\"}", str);
    }

    @Data
    static class Bean1 {
        private String oAuthName;
        private Integer age;
    }