前段时间,使用jackson封装了json字符串转换为javabean的方法,代码如下:

  1. public static <T> T renderJson2Object(String json, Class clazz){
  2. if(!StringUtil.checkObj(json)){
  3. return null;
  4. }
  5. try {
  6. mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
  7. DateFormat myDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  8. mapper.getSerializationConfig().setDateFormat(myDateFormat);
  9. return (T)mapper.readValue(json, clazz);
  10. } catch (IOException e) {
  11. log.error(e);
  12. throw new IllegalArgumentException(e);
  13. }
  14. }
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指定的类型的对象,如:

  1. renderJson2Object("{\"name\":\"china\",\"age\":\"<span style="white-space: normal;">5000</span>\"}",Student.class);
renderJson2Object("{\"name\":\"china\",\"age\":\"5000\"}",Student.class);

Student类里有name,age的get,set方法,代码如下:

  1. public class Student implements Serializable{
  2. private static final long serialVersionUID = 685922460589405829L;
  3. private String name;
  4. private String age;
  5. /*get set略*/
  6. }
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方法时,会抛

  1. java.lang.IllegalArgumentException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "address" (Class util.Student), not marked as ignorable
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中的

  1. @Override
  2. protected void handleUnknownProperty(JsonParser jp, DeserializationContext ctxt, Object beanOrClass, String propName)
  3. throws IOException, JsonProcessingException
  4. {
  5. ... ... ...
  6. <span style="color: #ff0000;">// If registered as ignorable, skip</span>
  7. <span style="color: #ff0000;">if (_ignoreAllUnknown ||
  8. (_ignorableProps != null && _ignorableProps.contains(propName))) {
  9. jp.skipChildren();
  10. return;
  11. }</span>
  12. ... ... ...
  13. }
@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中的

  1. protected void addBeanProps(DeserializationConfig config,
  2. BasicBeanDescription beanDesc, BeanDeserializerBuilder builder)
  3. throws JsonMappingException
  4. {
  5. ... .... ...
  6. // Things specified as "ok to ignore"? [JACKSON-77]
  7. AnnotationIntrospector intr = config.getAnnotationIntrospector();
  8. boolean ignoreAny = false;
  9. {
  10. Boolean B = intr.findIgnoreUnknownProperties(beanDesc.getClassInfo());
  11. if (B != null) {
  12. ignoreAny = B.booleanValue();
  13. builder.setIgnoreUnknownProperties(ignoreAny);
  14. }
  15. }
  16. ... ... ...
  17. }
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类的正确做法为:

  1. <span style="color: #ff0000;">@JsonIgnoreProperties(ignoreUnknown = true) </span>
  2. public class Student implements Serializable{
  3. private static final long serialVersionUID = 685922460589405829L;
  4. private String name;
  5. private String age;
  6. /*get set.....*/
@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注解

发表评论
      <p style="text-align:right;margin-right:30px;">(快捷键 Alt+S / Ctrl+Enter) <input class="submit" id="quick_reply_button" name="commit" type="submit" value="提交"></p>
</form>
<script type="text/javascript">
new HotKey("s",function() {$('quick_reply_button').click();},{altKey: true, ctrlKey: false});
new HotKey(new Number(13),function() {$('quick_reply_button').click();},{altKey: false, ctrlKey: true}); new Validation("comment_form", {immediate: false, onFormValidate: function(result, form){
if(result) {
new Ajax.Request('/blog/create_comment/1131059', {
onFailure:function(response){
$('comments').insert({after:response.responseText})
form.spinner.hide();
Element.scrollTo($('comments'));
},
onSuccess:function(response){
Element.scrollTo($('comments'));
var new_comment = new Element('div', {}).update(response.responseText).firstChild;
var comment_id = new_comment.readAttribute('id'); $('comments').insert({after:response.responseText});
$('editor_body').value = ""; var css_rules = '#' + comment_id + ' pre';
highlightNewAddContent(css_rules);
processComment();
code_favorites_init(css_rules); form.spinner.hide();
}, parameters:Form.serialize(form)
});
}
}});
</script>
</div>

jackson 的UnrecognizedPropertyException错误的更多相关文章

  1. jackson 常见问题

    org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type   org.codehaus ...

  2. springMvc 4.0 jackson包改变

    使用之前的json包出包java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException错误. sp ...

  3. 【maven 报错】maven项目执行maven install时报错Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)

    在使用maven新建的web项目中,执行 执行如上的这两个操作,报错: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-co ...

  4. SpringMVC+Spring+mybatis项目从零开始--Spring mybatis mysql配置实现

    上一章我们把SSM项目结构已搭建(SSM框架web项目从零开始--分布式项目结构搭建)完毕,本章将实现Spring,mybatis,mysql等相关配置. 1.    外部架包依赖引入 外部依赖包引入 ...

  5. maven搭建ssm框架问题总结

    1. Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.0:compile (default-comp ...

  6. 航空概论(历年资料,引之百度文库,PS:未调格式,有点乱)

    航空航天尔雅 选择题1. 已经实现了<天方夜谭>中的飞毯设想.—— A——美国2. 地球到月球大约—— C 38 万公里3. 建立了航空史上第一条定期空中路线—— B——德国4. 对于孔明 ...

  7. Jackson反序列化错误:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field的解决方法

    说明:出现这种问题的情况是由于JSON里面包含了实体没有的字段导致反序列化失败. 解决方法: // 第一种解决方案 // ObjectMapper对象添加 mapper.configure(Deser ...

  8. jackson json转实体对象 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException

    Jackson反序列化错误:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field的解 ...

  9. spring-data-jpa 中,如果使用了one-to-many , many-to-one的注释,会在Jackson进行json字符串化的时候出现错误

    问题: spring-data-jpa 中,如果使用了one-to-many , many-to-one的注释,会在Jackson 2.7.0 进行json字符串化的时候出现错误. 解决办法: 通过在 ...

随机推荐

  1. Linux 系统中 sudo 命令的 10 个技巧

    概览 sudo 表示 "superuser do". 它允许已验证的用户以其他用户的身份来运行命令.其他用户可以是普通用户或者超级用户.然而,大部分时候我们用它来以提升的权限来运行 ...

  2. JZOJ 1321. 灯

    1321. 灯 Time Limits: 1000 ms  Memory Limits: 65536 KB  Detailed Limits Goto ProblemSet Description 贝 ...

  3. PAT Basic 1084

    1084 外观数列 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 n+1 项是 ...

  4. TI C64X+通用库函数使用手册

    在使用前,当知悉以下几点: 函数进程由手动汇编而成,已充分发挥器件效率.同时TI对外提供C和线性汇编代码 对于个人一些特殊应用,DSPLIB可能会带来额外的cycle消耗 TI DSPLIB依平台和时 ...

  5. 1、python的基础

    一.python组成 python程序的内容主要由变量.数据.关键字.操作符组成. 二.变量 在python中,变量指的是其指向的数据是可变的. 首先我们要了解一下python的内存管理.数据创建后就 ...

  6. 笔记-爬虫-robots.txt

    笔记-爬虫-robots.txt 1.      robots.txt文件简介 1.1.    是什么 robots.txt是用来告诉搜索引擎网站上哪些内容可以被访问.哪些不能被访问.当搜索引擎访问一 ...

  7. Java语言基础---逻辑运算(长路短路运算)

    长路短路运算的区别 长路与运算&:是指在两边都是整数时,是逐位与运算,在两边是关系运算时,是逻辑运算. 短路与运算&&:是指从左至右,遇到false,则停止后面的运算. 长路或 ...

  8. BZOJ 4393: [Usaco2015 Dec]Fruit Feast

    DP #include<cstdio> using namespace std; int T,A,B,F[5000005],G[5000005]; int main(){ scanf(&q ...

  9. HDU 3896 Greatest TC 双连通分量

    题意 给一个连通的无向图,有两种询问: \(a, b, c, d\),问如果删掉\(c,d\)之间的边,\(a,b\)之间是否还连通 \(a, b, c\),问如果删掉顶点\(c\),\(a,b\)之 ...

  10. idea 占用内存优化调整

      idea 占用内存优化调整 https://www.cnblogs.com/metoy/p/5967696.html   https://blog.csdn.net/zdxxinlang/arti ...