`
olivechinese
  • 浏览: 76070 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jackson 的UnrecognizedPropertyException错误

    博客分类:
  • JAVA
 
阅读更多

 

前段时间,使用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注解

 

分享到:
评论
3 楼 up2pu 2012-05-13  
我用的是1.9.4,setVisibility这个不设置也不影响,主要是下面那句
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
2 楼 olivechinese 2012-05-13  
up2pu 写道
ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);



兄弟使用的是什么版本?
我用的是1.8.3,没发现有ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY)这个setVisibility方法
1 楼 up2pu 2012-05-10  
ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

相关推荐

    jackson-annotations、jackson-core、jackson-databind

    "jackson-annotations"、"jackson-core"和"jackson-databind"是Jackson库的三个核心模块,它们协同工作,提供了强大的JSON序列化和反序列化功能。 1. **jackson-annotations**:这个模块包含了各种注解,如`@...

    jackson-annotations jackson-core jackson-databind

    标题提到的"jackson-annotations"、"jackson-core"和"jackson-databind"是Jackson库的核心组成部分,它们协同工作,使得Java对象能够被序列化为JSON,以及反序列化为Java对象。 1. **jackson-annotations**:这个...

    jackson-annotations.jar jackson-core.jar jackson-databind.jar

    此外,Jackson还有强大的错误处理机制,能够捕获和处理在序列化或反序列化过程中可能出现的问题。 为了优化性能,Jackson提供了许多配置选项,例如启用或禁用特定的序列化特性,设置日期格式,以及处理循环引用等。...

    jackson-core所需的三个包;jackson-databind.jar,jackson-annotations.jar,jackson-core.jar

    Jackson是Java领域中广泛使用的JSON处理库,它提供了一套高效、灵活的API来解析、生成、转换JSON数据。在Spring MVC框架中,Jackson库通常用于处理HTTP请求和响应中的JSON数据,使得Java对象能够方便地序列化为JSON...

    jackson 全部jar包

    8. **错误处理**:Jackson提供了一套完整的错误处理机制,包括异常类和错误报告,帮助开发者快速定位和解决JSON处理过程中的问题。 9. **配置选项**:Jackson提供了大量的配置选项,允许开发者根据项目需求定制JSON...

    jackson2.7-jar

    8. **错误处理**:Jackson 2.7改进了错误报告机制,更容易调试序列化和反序列化过程中的问题。 9. **JSON Schema支持**:Jackson可以生成JSON Schema,这是一个规范,用于验证JSON数据是否符合指定的结构。 10. **...

    jackson-annotations-2.9.5.jar ,jackson-core-2.9.5.jar,jackson-databind-2.9.5.jar

    这个压缩包包含的三个核心组件——`jackson-annotations-2.9.5.jar`、`jackson-core-2.9.5.jar`和`jackson-databind-2.9.5.jar`是Jackson库的核心部分,它们协同工作,提供了全面的JSON解析和生成能力。 1. **...

    jackson 1.5中文帮助文档

    7. **错误处理**:在序列化和反序列化过程中,Jackson会捕获并处理可能出现的错误,如类型不匹配、无效的JSON格式等。开发者可以通过异常处理机制来应对这些问题。 8. **安全性**:Jackson有一些安全配置,例如禁止...

    jackson-databind jackson-annatation jackson-core jackson-mapper

    Jackson是Java领域中广泛使用的JSON处理库,由FasterXML公司开发并维护。它提供了高效、功能丰富的处理JSON的方式,包括序列化和反序列化。在这个包中提到了四个关键组件:"jackson-databind"、"jackson-annotations...

    jackson-annotations-2.2.3.jar jackson-core-2.2.3.jar jackson-databind-2.2.3.jar

    这个压缩包包含了Jackson库的三个核心组件的2.2.3版本:`jackson-annotations-2.2.3.jar`、`jackson-core-2.2.3.jar` 和 `jackson-databind-2.2.3.jar`。 1. **jackson-annotations-2.2.3.jar**: 这个模块提供了...

    jackson-core-2.10.0.zip

    8. **错误处理**:Jackson提供了一套完善的错误处理机制,当遇到无效的JSON数据或者序列化/反序列化过程中的问题时,能够给出明确的错误信息。 在`jackson-core-2.10.0`压缩包中,通常会包含以下文件: - `jackson...

    jackson-core-asl-1.9.13+jackson-mapper-asl-1.9.13札包

    在这个"jackson-core-asl-1.9.13+jackson-mapper-asl-1.9.13"压缩包中,包含的是Jackson库的两个核心组件:`jackson-core-asl-1.9.13.jar`和`jackson-mapper-asl-1.9.13.jar`。 `jackson-core-asl-1.9.13.jar`是...

    jackson-all-1.9.0.jar,jackson-all-1.9.9.jar,jackson-all-1.9.11.jar

    为了实现这一功能,我们需要依赖于特定的库,这里提到的`jackson-all-1.9.0.jar`, `jackson-all-1.9.9.jar`, 和 `jackson-all-1.9.11.jar`就是用于处理JSON序列化与反序列化的Jackson库的不同版本。 Jackson是Java...

    jackson依赖jar包.

    Jackson是Java领域中广泛使用的JSON处理库,由FasterXML公司开发并维护。它提供了高效、功能丰富的处理JSON的各种工具,包括序列化和反序列化。在Java应用程序中,Jackson库是一个不可或缺的部分,特别是对于那些...

    jackson-databind-2.9.10.8.jar升级相关jar包

    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升级jar包2.12.4版本

    在Java开发中,Jackson库是广泛使用的JSON处理库,它提供了高效的序列化和反序列化功能。然而,随着时间的推移,Jackson库也可能暴露出安全问题。标题提到的"Jackson-databind任意文件读取漏洞"就是一个典型的例子,...

    jackson-annotations-2.2.3.jar(Jackson解析需引入的包)

    Jackson是Java领域中广泛使用的JSON处理库,由FasterXML公司开发并维护。该库提供了一整套解决方案,包括序列化、反序列化以及数据绑定等功能,使得在Java应用程序中处理JSON数据变得非常便捷。标题提到的"jackson-...

    Jackson 2.9.3 和 jackson 2.9.3源码

    Jackson是Java领域中广泛使用的JSON处理库,2.9.3是其版本号。这个压缩包包含两个主要文件:`jackson-core-2.9.3.jar`和`jackson-core-master(1).zip`。前者是编译后的二进制JAR文件,可以直接在项目中引用以使用...

    jackson 完整Jar包

    Jackson fasterxml和codehaus的区别: 他们是Jackson的两大分支、也是两个版本的不同包名。Jackson从2.0开始改用新的包名fasterxml;1.x版本的包名是codehaus。除了包名不同,他们的Maven artifact id也不同。1.x...

    jackson-core-asl-1.9.13+jackson-mapper-asl-1.9.13jar包.

    本篇将深入探讨406错误的原因以及如何利用Jackson库进行修复。 406错误表示服务器生成的内容无法满足请求头中的Accept字段,意味着客户端声明它不接受服务器提供的数据格式。在Spring MVC中,当使用`@ResponseBody`...

Global site tag (gtag.js) - Google Analytics