使用Jackson解析属性首字母为大写的JSON串时首字母变小写

问题

面对不遵守驼峰命名规则的接口,比如属行首字母用大写,这样导致使用Jackson解析出来的对象的属性均为空,经过跟踪源码发现,是由于其根据getters方法解析的属性,属性字母都变为了小写,这就导致无法解析了出现了jackson Unrecognized field 的问题。
例如:

@Data
public class JobType {
    private int jobType;
    private String JOBNaMe;
}
public static void main(String[] args){
   JobType jobType = new JobType();
   jobType.setJOBNaMe("程序猿");
   String serialize = serialize(jobType);
   System.out.println(serialize);
}

结果:


{
  "jobType" : 0,
  "jobnaMe" : "程序猿"
}

使用注释

在属性上加@JsonProperty 注解,并且在对应的setter ,getter 上面加上@JsonIgnore,这样就可以了

@Data
public class JobType {
    private int jobType;
    
    @JsonProperty("JOBNaMe")
//    @JsonProperty 还可以这样写
    private String JOBNaMe;
    
 	@JsonIgnore
    public String getJOBNaMe() {
        return JOBNaMe;
    }
    @JsonIgnore
    public void setJOBNaMe(String JOBNaMe) {
        this.JOBNaMe = JOBNaMe;
    }
}

结果:

{
  "jobType" : 0,
  "JOBNaMe" : "程序猿"
}

总结

虽说问题可以得到解决,但是如果一开始就规范命名,就不会出现这些问题,所以还是要从源头抓起。
另外,没有给值的属行会初始化为0值,int时为0,Integer时才为null,所以属行用基本类型还是包装类一定要根据实际情况选择,不能稀里糊涂的就随便用。

fastjson也存在这个问题

fastjson在将bean转换为json时,先取出对应的methodName: getTEST,从methodName的第4个字符开始,取出propertyName:TEST,它默认认为这个propertyName的首字母是在定义getter的时候被写成大写的,现在要转成小写:
propertyName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
结果,正确的TEST就被转成错误的tEST了。

你可能感兴趣的:(web)