文档章节

Jackson异常情况处理

BKC
 BKC
发布于 2016/09/29 17:05
字数 1599
阅读 183
收藏 6
点赞 0
评论 0

1、空值转换-异常情况:

      Can not instantiate value of type [map type; class java.util.HashMap, [simple type, class java.lang.String] -> [simple type, class java.lang.String]] from JSON String; no single-String constructor/factory method  

解决方法,在ObjectMapper配置中增加:   ```  mapper.configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true) ;


2、转义字符-异常情况:
        org.codehaus.jackson.JsonParseException: Illegal unquoted character ((CTRL-    CHAR, code 9)): has to be escaped using backslash to be included in string value  at [Source: java.io.StringReader@10cfc2e3; line: 1, column: 2461]   
        解决办法,在ObjectMapper配置中增加:
 ```
mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true) ;  

3、定义针对日期类型的反序列化时的数据格式    ``` mapper.getDeserializationConfig().setDateFormat(new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss"));


   jackson在http接口测试环境中的应用

        这里先简单的做下jackson的介绍:jackson可以很方便并且高效的将json对象转化成Java对象,也可以将Java对象转换成json对象和xml文档。Jackson有几个显著的特点:性能高,对于复杂对象和大数据量对象的序列化和反序列化,表现出比同类工具包(如gson,json-lib等)更优的性能;功能强,绑定所有JDK中的通用类以及Java Bean Class,Collection,Map和Enum;无依赖,除了JDK外无任何他依赖;完全开源,并且有丰富的文档和用户群体,便于自学。

        在进行http请求的接口测试的过程中,我们需要灵活方便的处理http请求返回数据,使json串反序列化成为java对象,这样我们才能方便地对返回数据进行校验。如何试用jackson进行反序列化,网上内容很多,所以在此补赘述。我想重点说下在接口测试过程中需要注意的点和可能会遇到的问题的解决办法。

【注意点1】: 尽可能使用开发人员使用的数据对象类作为反序列化时的mapper类。
        通常情况下,浏览器在发送http请求向服务端应用请求数据的时候,客户端应用都会依赖一个服务端的client包,以便于反序列化json数据后,形成用于vm模板的渲染所需要的java对象。这样就为我们测试http接口提供了便利,我们只需要在我们测试应用中依赖这个client的jar包,就可以方便的运用这些对象去组装我们的mapper。

【注意点2】: 当开发人员提供的数据对象类“不好用”的时候,需要自行创建pojo类,或者使用JDK的原生数据对象。
    ObjectMapper初始化配置的代码:

ObjectMapper objectMapper = newObjectMapper(); //配置为true表示mapper接受只有一个元素的数组的反序列化 objectMapper.configure(Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY,true); //配置为false表示mapper在遇到mapper对象中存在json对象中没有的数据变量时不报错,可以进行反序列化 objectMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES,false); //新版的jackson设置mapper的方法,功能同上 objectMapper.getDeserializationConfig().without(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES); //定义针对日期类型的反序列化时的数据格式 objectMapper.getDeserializationConfig().setDateFormat(newSimpleDateFormat("yyyy-MM-dd HH:mm:ss")); 下面是处理json的工具类代码: public static <T> T getObjectFromJsonString(String jsonString, TypeReference<T> tr) { if(jsonString == null||"".equals(jsonString)){ returnnull; } else { try { return (T)objectMapper.readValue(jsonString, tr); }catch(Exception e) { e.printStackTrace(); } } return null; }

此方法采用了泛型,是为了抽象json返回对象的数据类型,以便后续开发通用的测试验证类

   下面是调用类的方法的代码:

actDO = JsonUtils.getObjectFromJsonString(jsonStr, new TypeReference<BaseResponseModel<PublishCommentResultMapper>>(){});

或者

actDO = JsonUtils.getObjectFromJsonString(jsonStr, new TypeReference<BaseResponseModel<Map<String,String>>>() {});

   下面是BaseResponseModel的代码:

public class BaseResponseModel<T> implements Serializable{ private static final long serialVersionUID = 5393610697317077173L; private List<T> result; private boolean isSuccess; private String errorMsg; private int errorCode; private Integer total; //getter/setter省略 }


   BaseResponseModel封装了http请求返回的通用成员变量,例如:ErrorCode,IsSuccess,Total等
Mapper对象实例:

public class InfoAndRateMapper implements Serializable{ private static final long serialVersionUID = 1L; private List<BrandContentInfoDO> info; private List<Rate> rate; //getter/setter省略 }

   经常碰到的问题及解决办法:

Exception1:
 Unrecognized field “INFO” (Class com.tmall.brand.api.test.model.InfoAndRateMapper), not marked as ignorable
【异常解释】:当反序列化的json对象中有“INFO”,但mapper对象中没有该字段时报错。
    【解决办法】:在mapper中增加此变量
    
Exception2:

 Unrecognized field “typeString”

   【异常解释】:反序列化过程中出现不可识别的成员变量

   【解决办法】:增加mapper的属性配置:objectMapper .configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);此参数默认是true,即检查映射关系,当设置为false以后,objectMapper将忽略需解析的json串中“不认识”的字段

   例如:mapper对象中有private String name;的对象,当json对象中并没有此变量,那当这个属性值设置为false时,可成功反序列化。

   Exception3:

   org.codehaus.jackson.map.JsonMappingException : Can not instantiate value of type [collection type; class java.util.ArrayList, contains [simple type, class java.lang.Long]] from JSON String; no single-String constructor/factory method (through reference chain: com.tmall.brand.api.test.model.GetInfoAndRateRespModel["result"]->com.tmall.brand.api.test.model.InfoAndRateMapper["INFO"]->com.tmall.brand.service.domain.ratenews.BrandNewsQuery["typeList"])

   【异常解释】:jackson无法实例化json对象中变量类型的值

   【解决办法】:@JsonIgnoreProperties({ “typeList”})

   在mapper类之前加此标签忽略这个字段的反序列化

   Exception4:

   Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

   【异常解释】:无法反序列化没有START_OBJECT token的ArrayList

   【解决办法】:增加mapper的属性配置:

objectMapper.configure(Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

  Exception5:
    org.codehaus.jackson.map.JsonMappingException : No suitable constructor found for type [simple type, class com.taobao.matrix.snsplugin.common.enumconstants.EnumResultStatus]: can not instantiate from JSON object (need to add/enable type information?)
     at [Source: java.io.StringReader@98350a; line: 1, column: 89] (through reference chain: com.tmall.brand.api.test.model.BaseResponseModel["result"]->com.tmall.brand.api.test.model.PublishCommentResultMapper["status"])
    【异常解释】:jackson无法实例化json对象,没有找到适合的构造函数。
    【解决办法】:jackson在进行反序列号的时候,需要Mapper类是普通的pojo类,并且类中的变量都需要有setXXX的set方法,如果没有set方法或者没有“正确”的set方法,就会报无法实例化JSON对象的异常
    例如:
    1、json对象的一个变量为

private boolean isSuccess;

   自动生成代码后的set方法为:(根据你自己的eclipse 的autogen来决定自动生成的代码模板)

public void setSuccess(boolean isSuccess) { this.isSuccess = isSuccess; }

   如果是这样,jackson在反序列化的时候就会报此异常,应改为:

public void setIsSuccess( boolean isSuccess) { this.isSuccess = isSuccess; }

   2、当JSON对象为:

public class XXXStatus extends XXXResultStatus<XXXStatus>{ private static final long serialVersionUID = 2385584133823877965L;

public static final Map<Integer, XXXStatus> codeMap = newHashMap<Integer,XXXStatus>();

public static final XXXStatus SUCCESS = newXXXStatus(0,"xxx","xxx");

private XXXStatus(intcode,Stringmsg,StringfrontMsg){

    super(code, msg, frontMsg);

    codeMap.put(code,this);

}

public static final XXXStatus getRelationStatus(intcode){

    XXXStatus satus = codeMap.get(code);

    if(satus== null){

        returnSYSTEM_ERROR;

    }

    returnsatus;

}

}
同样没有set方法,所以这样的JSON对象都需要重新创建一个自定义的mapper对象,用于jackson反序列化

© 著作权归作者所有

共有 人打赏支持
BKC

BKC

粉丝 2
博文 32
码字总数 35753
作品 0
朝阳
程序员
jackson常用注解和spring中的配置

spring默认使用的是jackson处理json的序列化和反序列化,有一些细节和小坑,基于spring4和jackson2.8做一些说明 @JsonIgnore @JsonIgnore是jackson的注解,jackson1版本和2版本没有区别,通常...

肥肥小浣熊 ⋅ 2017/12/01 ⋅ 0

使用CXF开发RestFul WebService问题解决方案

最近在项目中,因为几个系统自己需要数据交换,所以采用进来都比较流行的RestFul风格WebService,实现框架采用apache的cxf,apache的东西一直以来都是比较的好用,回话少说,进入正题。 首先...

xdev ⋅ 2013/05/18 ⋅ 3

jackson不能封装通用类

jackson不能封装通用类,遇到的问题就是不能直接把字符串转换成object public static Object jsonToObject(String jsonString) throws JsonParseException, JsonMappingException, IOExcept......

viney ⋅ 2012/12/11 ⋅ 0

JFinal—Json2Model

@JFinal 你好,想跟你请教个问题: 今天用jackson从json转对象的时候发现json2model的时候报错,异常如下: json字符串:{"user":{"email":"hello@hw.com","password":"world"}} org.codeha...

凯撒大弚 ⋅ 2012/08/27 ⋅ 4

@RequestBody接受参数报415错误

1.简介 @RequestBody 作用: 1) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上; 2) 再把HttpMessage...

多米亚单色 ⋅ 2017/05/18 ⋅ 0

Play 2.0 用户指南 - 使用JSON库 -- 针对Scala开发者

概述 使用JSON的推荐方式是使用 Play 的基于类的JSON库,位于play.api.libs.json下. 该库构建于Jerkson之上,它是一个Scala包装者,基于一个超快的基于Java的JSON库,Jackson. 这种方式的好处是,...

大东哥 ⋅ 2012/03/20 ⋅ 2

jackson字符串转对象报错

今天遇到一个线上报警,用jackson将字符串转对象报错了。 很尴尬的是,业务里使用的是 抛的异常,日志里看不到jacksjon报的错误原因。 没办法,只能自己写单测还原现场。 总算把jackson的异常...

小小浪把_Dont_know拍 ⋅ 2017/12/30 ⋅ 0

Android 编程下如何修改 jar 文件的包名

Android 编程下如何修改 jar 文件的包名 首先我们要说说为什么要修改 jar 文件的包名,jar 包我们会非常高频率的使用,尤其是用一些其他三方库的时候,往往把 java 代码打包成 jar 文件,方便...

jimmy2012 ⋅ 2016/03/23 ⋅ 0

java.io.EOFException: No content to map to Obje...

java异常: java.io.EOFException: No content to map to Object due to end of input org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2433) [jackson-mapper-as......

叶落花开 ⋅ 2012/03/11 ⋅ 1

Hibernate+SpringMVC+Spring配合jackson.jar使用报错!很着急!!!!!!

本人菜鸟一枚,尝试SpringMVC配合jackson包直接返回json格式给前台 首先,项目的lib下已经导入jackson-all-1.8.1.jar 其次,controller中方法也已经是用注解@responsebody @ResponseBodypubl...

蜡笔小新_ ⋅ 2014/03/04 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 43分钟前 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部