美文网首页
Jackson给字段指定别名

Jackson给字段指定别名

作者: CokeCode | 来源:发表于2021-06-24 11:54 被阅读0次

    有的时候,用于序列化、反序列化的类型中字段的名称,和JSON字符串中的字段的名称可能不是规范的映射关系,这个时候我们就需要给类型中的字段指定一个JSON处理时的别名,比如:

    public class TestVO {
        private String Xyz;
    
        public String getXyz() {
            return Xyz;
        }
    
        public void setXyz(String xyz) {
            Xyz = xyz;
        }
    }
    

    这个时候使用Jackson的默认配置进行序列化或反序列化,由于Jackson优先使用getter, setter方法来进行JSON处理,这里的getter, setter方法都是使用IDE自动生成的,那就会导致生成的报文中,Xyz字段被Jackson处理成了xyz

        @Test
        void toJson() throws JsonProcessingException {
            TestVO vo = new TestVO();
            vo.setXyz("xyz");
            System.out.println(objectMapper.writeValueAsString(vo)); // {"xyz":"xyz"}
        }
    

    也就是说,成员变量XyzgetXyz方法在Jackson的默认命名映射中会被序列化为xyz,这个是很直观的,需要说明的是,如果成员变量真的名为Xyz,那么其通过IDE自动生成的getter方法确实是getXyz,这种就跟成员变量xyz的getter方法一样了,所以成员变量Xyz这种以大写字母开头,紧跟第二个字母是小写字母的命名是非常不规范的,应该严格避免,这是题外话。

    但是如果维护已有的代码,恐怕有时候就和规范有所出入,如果我们希望生成的JSON报文和反序列化的JSON报文里面的字段名和类型中的字段名保持一致,换句话说我们不希望使用Jackson默认的字段名称映射规则,我们希望自己给成员变量指定别名,比较好的有两种方法:

    public class TestVO {
        @JsonProperty
        private String Xyz;
    
        @JsonIgnore
        public String getXyz() {
            return Xyz;
        }
        @JsonIgnore
        public void setXyz(String xyz) {
            Xyz = xyz;
        }
    }
    

    另一种方法是:

    public class TestVO {
    
        private String Xyz;
    
        @JsonProperty("Xyz")
        public String getXyz() {
            return Xyz;
        }
    
        @JsonProperty("Xyz")
        public void setXyz(String xyz) {
            Xyz = xyz;
        }
    }
    

    可见第一种方法是让getter,setter方法失效来实现,第二种方法则是利用Jackson使用getter, setter方法的原理,给成员变量指定别名,综合起来,第二种方法只涉及一个注解@JsonProperty,并且只需要在getter, setter方法上使用,因此更简单。

    如果下面这么使用:

    public class TestVO {
        @JsonProperty
        private String Xyz;
    
        @JsonProperty
        public String getXyz() {
            return Xyz;
        }
        @JsonProperty
        public void setXyz(String xyz) {
            Xyz = xyz;
        }
    }
    

    会导致生成的JSON中多出个字段:{"xyz":"xyz", "Xyz":"xyz"},这种肯定不是最优秀的解决方案。

    相关文章

      网友评论

          本文标题:Jackson给字段指定别名

          本文链接:https://www.haomeiwen.com/subject/hupwyltx.html