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

文章讲述了在SpringBoot项目中,由于JavaDTO属性首字母大写,如`ID`,在反序列化时可能导致接收到的对象属性为null。解决方案包括使用`@JsonProperty`注解指定属性名或遵循Java属性命名规范。同时提到了`@JsonPropertyOrder`注解用于指定序列化时JSON对象的属性顺序。
摘要由CSDN通过智能技术生成

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值