@JsonIgnoreProperties 不生效

本文探讨了在使用Jackson进行JSON反序列化时遇到的版本冲突问题,具体表现为使用不同版本的Jackson库导致的Unrecognized field错误。文章详细分析了问题原因,并提供了通过调整Jackson版本和配置ObjectMapper来解决此问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义类如下,

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

import org.codehaus.jackson.annotate.JsonProperty;

 

@JsonIgnoreProperties(ignoreUnknown = true)

public class TenantSpecialLinePo extends TenantLinePo

{

    private static final long serialVersionUID = -1356444280247234290L;

private Integer tLineId;

……

}

 

反序列化

import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper objectMapper = new ObjectMapper();

list = objectMapper.readValue(msgObject.getString("data"), TenantSpecialLinePo[].class);

 

提示错误:

Unrecognized field "azDeviceId" (class com.huawei.netmonitor.server.entity.tenantSpecilLine.TenantSpecialLinePo), not marked as ignorable

在网上搜索,原来是jackson版本错误混合使用导致,org.codehaus.jackson.annotate (version 1.x),而ObjectMapper 的版本是com.fasterxml.jackson.databind (version 2.x)

https://stackoverflow.com/questions/20986995/jsonignoreproperties-not-working

 

仔细查看之前的代码,为什么原来代码没有报错

import org.codehaus.jackson.map.ObjectMapper;

TenantSpecialLineResponseBean tenantSpecialLineResponseBean = objectMapper.readValue(in, TenantSpecialLineResponseBean.class);

 

那么 这两个版本用法有什么区别,参照这里

https://blog.youkuaiyun.com/ClementAD/article/details/46416647

原来Jackson fasterxml是Jackson 2.0的新包名,1.x版本现在只提供bug-fix,而2.x版本还在不断开发和发布中。如果是新项目,建议直接用2x,即fasterxml jackson。

 

补充:

 json字符串 反序列化成对象,除了使用@JsonIgnoreProperties 注解,还可以用下面方法配置:

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

转载于:https://www.cnblogs.com/albertarmstrong/p/10234242.html

修改完成后,发现 machineType=null, intervalTime=null ,什么原因呢?下方是我的配置信息和代码:# 指定服务的端口 server.port=9200 # 指定服务的名称 spring.application.name=geochance-cxjc # 监测服务操作系统(可选值 win | lin) monitor.machine.type=win # 监测服务时间间隔(可选值 300 | 600) monitor.interval.time=300 # 监测服务名称信息 monitor.servers-list[0].name=auth monitor.servers-list[1].name=system monitor.servers-list[2].name=gateway monitor.servers-list[3].name=ddu monitor.servers-list[4].name=network # 监测服务模式信息(可选值 bash | shell | server) monitor.servers-list[0].mode=bash monitor.servers-list[1].mode=shell monitor.servers-list[2].mode=server monitor.servers-list[3].mode=shell monitor.servers-list[4].mode=server # 监测服务模式信息(可选值 bash | shell | server) monitor.servers-list[0].requrl=127.0.0.1:9201/connect/ monitor.servers-list[1].requrl=127.0.0.1:9202/connect/ monitor.servers-list[2].requrl=127.0.0.1:8080/connect/ monitor.servers-list[3].requrl=127.0.0.1:9203/connect/ monitor.servers-list[4].requrl=127.0.0.1:9203/connect/ package com.geochance.cxjc.config; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.geochance.cxjc.web.domain.ServiceConfig; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.validation.annotation.Validated; import javax.validation.Valid; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import java.util.ArrayList; import java.util.List; /** * 程序监测配置类 * */ @Data @Validated @Configuration @ConfigurationProperties(prefix = "monitor") // 新增注解解决序列化问题 @JsonIgnoreProperties( value = { "targetSource", // 忽略AOP代理目标源 "$$beanFactory", // 忽略CGLIB生成的beanFactory引用 "advised", // 防止Spring AOP内部状态泄露 "frozen", // 忽略代理配置状态标识 "exposeProxy" // 屏蔽代理暴露标记 }, ignoreUnknown = true // 允许忽略未定义字段 ) public class MonitorConfig { // 操作系统类型校验 @Pattern(regexp = "win|lin", message = "必须为win或lin") private String machineType; // 时间间隔校验 @Min(300) @Max(600) private Integer intervalTime; // 服务列表校验 @Valid @Size(min = 1, message = "至少需要1个服务") private List<ServiceConfig> serversList = new ArrayList<>(); }
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值