问题
面对不遵守驼峰命名规则的接口,比如属行首字母用大写,这样导致使用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了。
版权声明:本文为weixin_44457814原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。