jackson 转 json时,字段名大小写问题

现象:

 

分析:

从图中,我们可以看到 A1这个字段在Json中出现了2次。

这种问题出现在一种情况下,当字段的首字母是大写,而且加上的@JsonProperty的值得首字母也是大写的时候。

 

什么原因呢?

jackson默认的字段属性发现规则如下:

所有被public修饰的字段->所有被public修饰的getter->所有被public修饰的setter。

 

字段都是private的,所以无法识别。

而 getter识别的时候无法却分首字母是大写还是小写,

所以jackson统一用java的规范假设成小写,所以会出现"a1"。

 

而@JsonProperty又指定了需要转换一个首字母大写的"A1",所以jackson又转出一个"A1"。

 

解决:

 

在转换的类的上面加上注解:

@JsonAutoDetect(fieldVisibility= JsonAutoDetect.Visibility.ANY,getterVisibility= JsonAutoDetect.Visibility.NONE)

意思是 对于所有修饰的field都进行识别,即 private,public,protected都会被识别。

对所有的getter方法都不进行识别,所以就不会识别出小写的"a1"。

照道理还需要加上setterVisibility的设置,不过经过测试,貌似不需要。

 

该问题还有一种体现, @JsonIgnore 注解失效。

    @Getter
    @Setter
    @Accessors(chain = true)
    public static class TestPO{
        @JsonIgnore
        private String aaa;      //全部小写
        @JsonIgnore
        private String Bbb;      //第一个字母大写
        @JsonIgnore
        private String DDd;      //前两个字母大写(其实,以大写字母开头的任意字符串都会是这种情况)
        @JsonIgnore
        private String eEe;      //第一个小写 第二个大写
        @JsonIgnore
        private String ffFff;     //前两个字母小写
    }

上面这个POJO转换成Json后,打印出:

{"bbb":"2","ddd":"3","eee":"4"}

原因就是大写字母在get方法上让jackson识别出了错误。中间标红的三种大写字母都让识别出错。

解决办法有两种:

第一个办法是,字段名尽量避免中间标红的三种方式。

第二个办法是,在POJO类上加上注解:

@JsonAutoDetect(fieldVisibility= JsonAutoDetect.Visibility.ANY,getterVisibility= JsonAutoDetect.Visibility.NONE)

 

posted on 2018-02-02 16:16  HB1  阅读(7488)  评论(0编辑  收藏  举报

导航