fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG]CamelCase has some problems

Open SuperEdison opened this issue 2 years ago • 4 comments

问题描述

简要描述您碰到的问题。

环境信息

请填写以下信息:

  • OS信息: Mac M1
  • JDK信息: zulu8
  • 版本信息:[e.g.:Fastjson2 2.x.x]

重现步骤

如何操作可以重现该问题:

  1. 使用 BeanUtils.getterName 方法
  2. 输入 UId 数据
  3. 出现 UId 错误
    public static void main(String[] args) {
        A vo = new A();
        vo.setCId("2");
        System.out.println(JSON.toJSONString(vo));
        //{"CId":"2"}
    }

    @Data
    static public  class A {
        private String uId;
        private String cId;
    }

期待的正确结果

对您期望发生的结果进行清晰简洁的描述。 //{"cId":"2"}

相关日志输出

请复制并粘贴任何相关的日志输出。

{"CId":"2"}

附加信息

如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。 image

SuperEdison avatar Jul 12 '22 03:07 SuperEdison

and than i found the error code that is here

image

CamelCase's definition is the first word is lowercase. but here why do you add char[1] && chars[1] <= 'Z' judge

SuperEdison avatar Jul 12 '22 03:07 SuperEdison

my mr https://github.com/alibaba/fastjson2/pull/547

SuperEdison avatar Jul 12 '22 03:07 SuperEdison

fastjson v1 is use reflect to solve fields name, but fastjson2 is use gettername to solve fields name. so i think need to use CamelCase definition to make obvious distinction.

SuperEdison avatar Jul 12 '22 03:07 SuperEdison

   @Test
    public void test1() {
        B vo = new B();
        vo.cId = "2";
        assertEquals("{\"cId\":\"2\"}", JSON.toJSONString(vo));
    }

    public static class B {
        public String uId;
        public String cId;
    }

你可以通过把field声明为public就可以解决这个问题

wenshao avatar Jul 15 '22 15:07 wenshao


    public static void main(String[] args) {
        A a = new A();
        a.setUId("a");
        System.out.println(JSON.toJSONString(a));
//        SpringApplication.run(DemoApplication.class, args);
    }

    @Data
    static public class A {
//        @JSONField(name = "uid")
        public String uId;
    }

如果加上get set方法 {"UId":"a","uId":"a"} 如果加上@JSONField(name = "uid") {"UId":"a","uid":"a"} 我一直没搞懂到底是以什么标准去序列号=。=感觉越来越复杂了。之前说的按javabean去定义序列化的key,那还能理解,那现在如果属性变成public那就又变味了

SuperEdison avatar Aug 25 '22 09:08 SuperEdison

  @Test
    public void test2() {
        assertEquals("abc", JSON.parseObject("{\"uId\":\"abc\"}", C.class).uId);
        assertEquals("abc", JSON.parseObject("{\"UId\":\"abc\"}", C.class).uId);
    }

    public static class C {
        private String uId;

        public String getUId() {
            return uId;
        }

        public void setUId(String uId) {
            this.uId = uId;
        }
    }

最新快照版本反序列化已经能支持自动识别多种输入

wenshao avatar Sep 10 '22 04:09 wenshao

https://github.com/alibaba/fastjson2/releases/tag/2.0.13 2.0.13版本已经发布,请用帮忙用新版本验证

wenshao avatar Sep 10 '22 07:09 wenshao