Java中的序列化与反序列化(四):Java类属性首字母或前两个字母大写获取属性值为null的问题

Java类属性首字母或前两个字母大写获取属性值为null的问题

  • 1、概述
  • 2、解决发方法
    • 2.1、解决方法
    • 2.2、问题深入
  • 3、其他要说的
  • 4、总结

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注解来对属性进行排序。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。我们下次见。

你可能感兴趣的:(开发遇到的小问题,SpringBoot,java,开发语言)