前段时间,使用jackson封装了json字符串转换为javabean的方法,代码如下:
public static <T> T renderJson2Object(String json, Class clazz){
if(!StringUtil.checkObj(json)){
return null;
}
try {
mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
DateFormat myDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.getSerializationConfig().setDateFormat(myDateFormat);
return (T)mapper.readValue(json, clazz);
} catch (IOException e) {
log.error(e);
throw new IllegalArgumentException(e);
}
}
,这个方法可以根据json字符串,转换为clazz指定的类型的对象,如:
renderJson2Object("{\"name\":\"china\",\"age\":\"5000\"}",Student.class);
Student类里有name,age的get,set方法,代码如下:
public class Student implements Serializable{
private static final long serialVersionUID = 685922460589405829L;
private String name;
private String age;
/*get set略*/
}
根据上面的json字符串可以正常转换为Student对象,
但是通常情况下,从前端传json字符串到后端,json字符串的值是不可控的或者被框架修改了json字符串,如在里面添加了其他的键值对,
如现在的json字符串为:"{\"address\":\"hunan\",\"name\":\"china\",\"age\":\"5000\"}",
Student类里根本没有address属性,这样的情况下使用renderJson2Object方法时,会抛
java.lang.IllegalArgumentException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "address" (Class util.Student), not marked as ignorable
意思是说Student类里没有address这个属性,所以无法正常转化,同时还指明了not marked as ignorable,即没有标明可忽略的特性,先看源码这句话的理解这句话的意思
类:org.codehaus.jackson.map.deser.BeanDeserializer中的
@Override
protected void handleUnknownProperty(JsonParser jp, DeserializationContext ctxt, Object beanOrClass, String propName)
throws IOException, JsonProcessingException
{
... ... ...
// If registered as ignorable, skip
if (_ignoreAllUnknown ||
(_ignorableProps != null && _ignorableProps.contains(propName))) {
jp.skipChildren();
return;
}
... ... ...
}
源码注释说,如果注册了忽略特性,则会跳过此步骤,那到底需要怎么忽略呢?
请再看类:org.codehaus.jackson.map.deser.BeanDeserializerFactory中的
protected void addBeanProps(DeserializationConfig config,
BasicBeanDescription beanDesc, BeanDeserializerBuilder builder)
throws JsonMappingException
{
... .... ...
// Things specified as "ok to ignore"? [JACKSON-77]
AnnotationIntrospector intr = config.getAnnotationIntrospector();
boolean ignoreAny = false;
{
Boolean B = intr.findIgnoreUnknownProperties(beanDesc.getClassInfo());
if (B != null) {
ignoreAny = B.booleanValue();
builder.setIgnoreUnknownProperties(ignoreAny);
}
}
... ... ...
}
intr.findIgnoreUnknownProperties(beanDesc.getClassInfo());
会查找目标对象中,是否使用了JsonIgnoreProperties 注解,其中把注解的value值赋给了builder.setIgnoreUnknownProperties(ignoreAny);
到此Student类的正确做法为:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Student implements Serializable{
private static final long serialVersionUID = 685922460589405829L;
private String name;
private String age;
/*get set.....*/
}
看红色注解,现在暂时找到在类中添加注解(感觉具体的pojo对象和jackson耦合),不知道有没有其他方法,设全局变量来控制,如果有朋友知道,请告诉我谢谢。。。
谢谢 up2pu 兄弟的帮助,使用mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false),
则无需在目标类中添加JsonIgnoreProperties注解
分享到:
相关推荐
jackson2.9 搭配spring4使用,如果版本不符合,会出现“http请求415错误Unsupported Media Type”错误
jackson-databind-2.9.10.8.jar升级相关jar包包含: jackson-module-jaxb-annotations-2.9.10.jar jackson-core-2.9.10.jar jackson-databind-2.9.10.8.jar jackson-annotations-2.9.10.jar jackson-jaxrs-json-...
jackson-annotations.jar jackson-core.jar jackson-databind.jar
jackson-databind jackson-annatation jackson-core jackson-mapper
Jackson fasterxml和codehaus的区别: 他们是Jackson的两大分支、也是两个版本的不同包名。Jackson从2.0开始改用新的包名fasterxml;1.x版本的包名是codehaus。除了包名不同,他们的Maven artifact id也不同。1.x...
Jackson 入门 Jackson 入门 Jackson 入门
jackson优势: (1)Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。 (2)相比json-lib框架,Jackson所依赖的jar包较少,只需下载:jackson-all-1.6.*.jar ~ jackson-all-...
jackson-annotations-2.9.5.jar ,jackson-core-2.9.5.jar,jackson-databind-2.9.5.jar
jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-...
赠送jar包:jackson-annotations-2.13.1.jar; 赠送原API文档:jackson-annotations-2.13.1-javadoc.jar; 赠送源代码:jackson-annotations-2.13.1-sources.jar; 赠送Maven依赖信息文件:jackson-annotations-...
赠送jar包:jackson-databind-2.12.5.jar; 赠送原API文档:jackson-databind-2.12.5-javadoc.jar; 赠送源代码:jackson-databind-2.12.5-sources.jar; 赠送Maven依赖信息文件:jackson-databind-2.12.5.pom; ...
赠送jar包:jackson-databind-2.13.1.jar; 赠送原API文档:jackson-databind-2.13.1-javadoc.jar; 赠送源代码:jackson-databind-2.13.1-sources.jar; 赠送Maven依赖信息文件:jackson-databind-2.13.1.pom; ...
赠送jar包:jackson-annotations-2.11.4.jar; 赠送原API文档:jackson-annotations-2.11.4-javadoc.jar; 赠送源代码:jackson-annotations-2.11.4-sources.jar; 赠送Maven依赖信息文件:jackson-annotations-...
jackson开发中用到的三个jar包,包含jackson-annotations-2.2.3.jar jackson-core-2.2.3.jar jackson-databind-2.2.3.jar
赠送jar包:jackson-databind-2.9.7.jar; 赠送原API文档:jackson-databind-2.9.7-javadoc.jar; 赠送源代码:jackson-databind-2.9.7-sources.jar; 包含翻译后的API文档:jackson-databind-2.9.7-javadoc-API...
Jackson jar包: jackson-annotations-2.5.0.jar jackson-core-2.5.0.jar jackson-databind-2.5.0.jar
赠送jar包:jackson-dataformat-yaml-2.11.4.jar; 赠送原API文档:jackson-dataformat-yaml-2.11.4-javadoc.jar; 赠送源代码:jackson-dataformat-yaml-2.11.4-sources.jar; 赠送Maven依赖信息文件:jackson-data...
包括的内容为jackson-module-jaxb-annotations-2.8.1.jar、jackson-jr-all-2.4.3.jar、jackson-dataformat-xml-2.7.4.jar、jackson-databind-2.4.5.jar、jackson-core-2.2.3.jar、...。欢迎你下载使用,谢谢!
开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 ...
开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-...