【web开发】fastjackson转换json字符串为bean时忽略未知字段

在Web开发中,当JSON数据包含Bean未定义的字段时,可能导致转换失败。FastJackson提供了一个解决方案,即在Bean类上使用@JsonIgnoreProperties(ignoreUnknown = true)注解,这将忽略JSON中的未知字段。通过这样做,可以确保即使JSON结构有所变化,也能成功转换。

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

在做json转换为bean对象时经常遇到有时json中新增了字段,但是bean中未及时增加适配的属性,导致pojo转换失败的问题,在使用faskjackson时可以在bean的类上使用@JsonIgnoreProperties(ignoreUnknown = true)来忽略未能识别的字段。如下为一个测试用例的主要实现(其中未包含faskjackson转换json为bean的部分,这部分请自行实现):

package api.landsem.tester.misc;

import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.util.Assert;

import api.landsem.tester.media.BaseTester;
import api.landsem.utils.LocalStringUtils;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

public class Json2BeanTester extends BaseTester{
	private final static Logger logger = Logger.getLogger(Json2BeanTester.class);
	
	@JsonIgnoreProperties(ignoreUnknown = true)
	public static class Ta {
		private String payload;
		private String messagetype;
		private String timestamp;
		

		public String getPayload() {
			return payload;
		}

		public void setPayload(String payload) {
			this.payload = payload;
		}

		public String getMessagetype() {
			return messagetype;
		}

		public void setMessagetype(String messagetype) {
			this.messagetype = messagetype;
		}

		public String getTimestamp() {
			return timestamp;
		}

		public void setTimestamp(String timestamp) {
			this.timestamp = timestamp;
		}

		@Override
		public String toString() {
			return "Ta [payload=" + payload + ", messagetype=" + messagetype
					+ ", timestamp=" + timestamp + "]";
		}
		
		/*
		private String messageid;

		public String getMessageid() {
			return messageid;
		}

		public void setMessageid(String messageid) {
			this.messageid = messageid;
		}	
		 */
		
		
	}

	@Test
	public void test() {
		final String json = "{\"payload\":\"eyJsYXN0VGltZSI6IjIwMTctMTEtMjQgMTQ6Mzg6MjEuMTI3IiwidGltZSI6IjIwMTctMTEtMjQgMTQ6Mzk6MDYuNDUyIiwicHJvZHVjdEtleSI6InByTTFDSlNuVXBOIiwiZGV2aWNlTmFtZSI6Ijg2OTQ0OTAyMTk5MzE3NCIsInN0YXR1cyI6Im9mZmxpbmUifQ==\",\"messagetype\":\"status\",\"messageid\":933948069962403840,\"timestamp\":1511505546}";
		Ta ta = (Ta) LocalStringUtils.jsonToObject(json, Ta.class);
		Assert.notNull(ta, "Convert error!");
		logger.info("bean="+ta.toString());
	}
}

如上述示例所述,json中包含一个messageid的字段,该字段在bean实体类Ta中不存在,如果去掉@JsonIgnoreProperties(ignoreUnknown = true)注解,那么转换时将报如下错误:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "messageid" (class api.landsem.tester.misc.Json2BeanTester$Ta), not marked as ignorable (3 known properties: "messagetype", "payload", "timestamp"])
 at [Source: {"payload":"eyJsYXN0VGltZSI6IjIwMTctMTEtMjQgMTQ6Mzg6MjEuMTI3IiwidGltZSI6IjIwMTctMTEtMjQgMTQ6Mzk6MDYuNDUyIiwicHJvZHVjdEtleSI6InByTTFDSlNuVXBOIiwiZGV2aWNlTmFtZSI6Ijg2OTQ0OTAyMTk5MzE3NCIsInN0YXR1cyI6Im9mZmxpbmUifQ==","messagetype":"status","messageid":933948069962403840,"timestamp":1511505546}; line: 1, column: 268] (through reference chain: api.landsem.tester.misc.Json2BeanTester$Ta["messageid"])
	at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:62)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:834)
	at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1093)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1485)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1463)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:282)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2842)
	at api.landsem.utils.LocalStringUtils.jsonToObject(LocalStringUtils.java:70)
	at api.landsem.tester.misc.Json2BeanTester.test(Json2BeanTester.java:72)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值