使用的jackson版本为
jackson-databind-2.1.3.jar
jackson-annotations-2.1.2.jar
jackson-core-2.1.3.jar
在使用过程中发生了一个如下异常
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "age" (class test.json.TE), not marked as ignorable (3 known properties: , "id", "name", "flag"]) at [Source: java.io.StringReader@18f5824; line: 1, column: 43] (through reference chain: test.json.TE["age"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79) at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:579) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:672) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:906) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:328) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2797) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1943) at test.json.TestJson.jsonToClass(TestJson.java:21) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:292) 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)
测试代码如下:
package test.json;
import java.io.Serializable;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.junit.Test;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestJson {
@Test
public void jsonToClass() {
String s = "{\"id\":1,\"name\":\"test\",\"flag\":true,\"age\":19}";
ObjectMapper mapper = new ObjectMapper();
//mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
TE t;
try {
t = mapper.readValue(s, TE.class);
System.out.println(ToStringBuilder.reflectionToString(t));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class TE implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private long id;
private String name;
private boolean flag;
//private int age;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
/*public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}*/
}
原因是json的字符串中多了个age属性,在砖的时候TE类中没有此属性
这种情况是正常情况,一边改了,一边没改,该如何解决此问题
http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown
这是查到的解决方法,我用的版本是2.1版本的,修改如下
package test.json;
import java.io.Serializable;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.junit.Test;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestJson {
@Test
public void jsonToClass() {
String s = "{\"id\":1,\"name\":\"test\",\"flag\":true,\"age\":19}";
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
TE t;
try {
t = mapper.readValue(s, TE.class);
System.out.println(ToStringBuilder.reflectionToString(t));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class TE implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private long id;
private String name;
private boolean flag;
//private int age;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
/*public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}*/
}
增加了
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);