1、概述
大家好,我是欧阳方超。
Spring Boot项目,定义了一个DTO,属性是大写的,当用它作为接口的接收对象时,会发现接收到的对象ID属性一直为null。
import lombok.Data;
@Data
public class Fa {
private String ID;
}
2、解决发方法
2.1、解决方法
出现这个问题,就是因为Jackson反序列化的原因,具体原因本次不细谈,解决方法有两个,
方法一
方法一就是在相应字段上加上@JsonProperty注解,
@JsonProperty(value = "ID")
private String ID;
方法二
方法二是规范化地给属性命名,具体说就是属性名前两个字母不能大写,如下方的描述:
Don’t capitalize first two letters of a bean property name
2.2、问题深入
上面大写的命名方式,如果使用com.alibaba.fastjson.JSON.toJSONString(param)这样的方法转成json字符串,也会发生问题,具体问题是这样的:
如果只加了@JsonProperty(value = “ID”),json字符串中将得到名称为iD的属性(注意字母i是小写);
如果只加了@JSONField(name = “ID”),json字符串中将得不到ID属性;
如果ID属性时既加了@JsonProperty(value = “ID”)又加了@JSONField(name = “ID”),那么转换后的json字符串中会正常得到ID属性;
为了避免出现这类问题,还是从Java属性的命名规范上下手吧。
3、其他要说的
既然说到了@JsonPropertyOrder注解,那就再介绍一下@JsonPropertyOrder吧,它作用于类上,用于指定序列化后 JSON 对象中属性的顺序。比如:
@JsonPropertyOrder({ "name", "age", "address" })
class MyObject {
private String address;
private int age;
private String name;
// getters and setters
}
在序列化为 JSON 时,Jackson 将会按照 @JsonPropertyOrder 注解中指定的顺序来排列 JSON 对象中的属性,即先输出 name,然后是 age,最后是 address。需要注意的是,如果在 @JsonPropertyOrder 注解中未指定属性的顺序,Jackson 将按照属性定义的顺序来排列 JSON 对象中的属性。如果某些属性未在 @JsonPropertyOrder 注解中声明,那么这些属性将按照默认顺序排列在已声明的属性之后。
还可以按照字母顺序排列属性:
@JsonPropertyOrder(alphabetic = true)
class MyObject {
private String address;
private int age;
private String name;
// getters and setters
}
4、总结
接口中接收到的对象某属性为空,一次偶然的接口排错让我意识到了这个问题,总之,还是从Java属性的命名规范上着手比较科学。最后说到的可以使用@JsonPropertyOrder注解来对属性进行排序。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。我们下次见。