关于用jackson的@JsonProperty注解属性名,会多出一个字段的问题

本文探讨了Jackson2如何处理POJO对象的序列化,涉及属性收集、getter方法处理、@JsonProperty注解的作用,以及如何通过@JsonAutoDetect避免冲突。特别提到在MVC编程中关于大小写命名的一些建议。

问题描述

jackson2对pojo类型序列化的处理时(即以下三个包,导入即生效)
如下在这里插入图片描述
Jackson2在初始化序列器时,对pojo类型对象会收集其属性信息,属性包括成员变量及方法,然后属性名称和处理过后的方法名称做为key保存到一个LinkedHashMap中。收集过程中会调用com.fasterxml.jackson.databind.util
.BeanUtil中的legacyManglePropertyName方法用来处理方法名称
它会将get/set方法前缀,即get或set去掉,并将其后面的连续大写字符转换成小写字符返回
例如: getNEWString会转变成newstring返回,属性名称为"Category",其生成的get方法就会是这样的"getCategory",处理过后就是这样的"category",这与属性Category并不冲突,可以同时存在于HashMap中。
收集完属性信息后,下面的步骤中会删除掉非可见的属性,一般指的是私有成员变量,这时,名称为"Category"的成员变量属性会被删除掉(即不加任何注释的状态,所以之前表格中字段数据会空白),这样的序列化结果是不会有问题的,但,如果加了@JsonProperty注释,Jackson2会认为这个属性是可见的,不必会删除,这时这两个表示同一个值的属性就会被一同序列化(JSON里面出现两个字段)。

public class Inv {
	@JsonProperty("id")
	private int id;
	@JsonProperty("Category")
	private String Category;
	@JsonProperty("Specification")
	private String Specification;
	@JsonFormat(pattern="yyyy-MM-dd")
	private Date Date;
	@JsonProperty("Orders")
	private int Orders;
	@JsonProperty("Balance")
	private int Balance;
	@JsonProperty("Remark")
	private String Remark;
	}


解决方案:

1.@JsonProperty 如果标注在get set方法上(此处博主没有进行过实现)
2.pojo类加注解@JsonAutoDetect(getterVisibility=JsonAutoDetect.Visibility.NONE)

最后:建议MVC编程的时候数据表的字段和pojo类字段写成小写,能减少很多错误!

部分引用https://blog.51cto.com/luhaiyou/2369886,非常感谢这篇文章

### Jackson 与 FastJson 冲突导致 `@JsonProperty` 注解失效的解决方案 在 Spring Boot 项目中,`@JsonProperty` 是 Jackson 提供的注解,用于在 Java 对象和 JSON 之间进行序列化和反序列化时指定字段JSON 属性名。然而,当项目中同时引入了 FastJson 时,可能会导致 `@JsonProperty` 注解失效。这是因为 Spring Boot 默认使用 Jackson 进行序列化和反序列化,但 FastJson 的存在可能会干扰这一过程,尤其是在响应返回时由 FastJson 负责序列化的情况下 [^2]。 #### 常见问题原因 1. **FastJson 干扰了默认的 Jackson 序列化机制**:当 FastJson 被引入项目后,Spring Boot 的自动配置可能会选择 FastJson 作为默认的 JSON 序列化工具,从而导致 Jackson 的 `@JsonProperty` 注解失效 [^1]。 2. **FastJsonJackson注解不兼容**:FastJson 使用 `@JSONField` 注解来控制序列化行为,而 Jackson 使用 `@JsonProperty`。两者在注解的处理上不兼容,导致 Jackson注解在 FastJson 环境下无法生效 [^3]。 3. **TypeReference 问题**:在反序列化时,FastJson 可能会将对象解析为 `LinkedHashMap` 而不是目标模型类,这会导致 `@JsonProperty` 在后续序列化时失效 [^4]。 #### 解决方案 ##### 1. **排除 FastJson 依赖** 最直接的解决方案是避免在项目中同时使用 FastJsonJackson。如果项目中没有强依赖 FastJson 的功能,可以完全移除 FastJson 的依赖,以确保 Jackson 成为唯一的 JSON 处理库。 ```xml <!-- 在 pom.xml 中移除 FastJson 依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency> ``` ##### 2. **显式配置 Jackson 为默认的 JSON 序列化工具** 如果必须保留 FastJson,可以通过显式配置确保 Spring Boot 使用 Jackson 进行序列化和反序列化。可以通过在启动类上添加 `@EnableWebMvc` 注解来覆盖默认的自动配置 [^1]。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @SpringBootApplication @EnableWebMvc // 显式启用 WebMvc,确保 Jackson 为默认 JSON 处理器 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ##### 3. **自定义 Jackson 的 `ObjectMapper`** 如果 `@EnableWebMvc` 无法解决问题,可以通过自定义 `ObjectMapper` 来强制使用 Jackson 进行序列化。 ```java import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { return new ObjectMapper(); } } ``` ##### 4. **使用 `@JSONField` 替代 `@JsonProperty`(仅限 FastJson 场景)** 如果项目必须使用 FastJson,可以考虑将 `@JsonProperty` 替换为 FastJson 提供的 `@JSONField` 注解,并指定字段名称 [^3]。 ```java import com.alibaba.fastjson.annotation.JSONField; public class User { @JSONField(name = "first_name") private String firstName; // Getter and Setter } ``` ##### 5. **避免混合使用 Jackson 和 FastJson 的序列化/反序列化逻辑** 确保在项目中统一使用一种 JSON 处理库,避免在不同地方混合使用 Jackson 和 FastJson 的序列化逻辑。例如,如果使用 FastJson 进行反序列化,则在后续操作中也应使用 FastJson 进行序列化,以避免类型问题 。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值