Jackson异常情况处理

 

Jackson异常情况处理

分类: J2EE   486人阅读  评论(0)  收藏  举报

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

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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配置中增加

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. mapper.configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true) ;   

 

2、转义字符-异常情况:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. org.codehaus.jackson.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 9)): has to be escaped using backslash to be included in string value  
  2.  at [Source: java.io.StringReader@10cfc2e3; line: 1, column: 2461]   

解决办法,在ObjectMapper配置中增加:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true) ;  

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

蒋壮
  发布:2013-04-05 22:04   分类: 接口测试文章分类框架分享   阅读:1,614 views    3条评论  

这里先简单的做下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初始化配置的代码:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ObjectMapper objectMapper = new ObjectMapper();
 
//配置为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( new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ));

 

下面是处理json的工具类代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static <T> T getObjectFromJsonString(String jsonString, TypeReference<T> tr) {
 
         if (jsonString == null || "" .equals(jsonString)) {
 
             return null ;
 
         } else {
 
             try {
 
                 return (T) objectMapper.readValue(jsonString, tr);
 
             } catch (Exception e) {
 
                 e.printStackTrace();
 
             }
 
         }
 
         return null ;
 
}

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

 

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

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

或者

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

下面是BaseResponseModel的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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;
 
     public boolean isSuccess() {
 
        return isSuccess;
 
     }
 
     public void setIsSuccess( boolean isSuccess) {
 
        this .isSuccess = isSuccess;
 
     }
 
     //其余getter/setter省略
}
BaseResponseModel封装了http请求返回的通用成员变量,例如:ErrorCode,IsSuccess,Total等

Mapper对象实例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class InfoAndRateMapper implements Serializable{
 
     private static final long serialVersionUID = 1L;
 
     private List<BrandContentInfoDO> info;
 
     private List<Rate> rate;
 
     public List<BrandContentInfoDO> getInfo() {
 
        return info;
 
     }
 
     public void setInfo(List<BrandContentInfoDO> info) {
 
        this .info = info;
 
     }
 
     public List<Rate> getRate() {
 
        return rate;
 
     }
 
     public void setRate(List<Rate> rate) {
 
        this .rate = rate;
 
     }
 
}

 

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

  • 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的属性配置:

?
1
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对象的一个变量为

?
1
private boolean isSuccess;

 

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

?
1
2
3
4
5
public void setSuccess( boolean isSuccess) {
 
        this . isSuccess = isSuccess;
 
}

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

?
1
2
3
4
5
public void setIsSuccess( boolean isSuccess) {
 
              this . isSuccess = isSuccess;
 
}

2、当JSON对象为:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class XXXStatus extends XXXResultStatus<XXXStatus> {
 
private static final long serialVersionUID = 2385584133823877965L;
 
public static final Map<Integer, XXXStatus> codeMap = new HashMap<Integer, XXXStatus>();
 
public static final XXXStatus SUCCESS = new XXXStatus( 0 , "xxx" , "xxx" );
....
 
private XXXStatus( int code, String msg, String frontMsg) {
     super (code, msg, frontMsg);
     codeMap.put(code, this );
}
 
public static final XXXStatus getRelationStatus( int code) {
     XXXStatus satus = codeMap. get (code);
     if (satus == null ) {
         return SYSTEM_ERROR;
     }
     return satus;
}
}

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

 


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
在Java中,`objectMapper.writeValueAsString`是Jackson库中的一个方法,用于将Java对象转换为JSON字符串。该方法在以下情况下可能会抛出异常: 1. 序列化异常(`JsonProcessingException`):当对象无法序列化为JSON字符串时,会抛出该异常。例如,如果对象中的字段具有不支持的数据类型或无法转换为JSON的类型,就会导致序列化异常。 2. IO异常(`IOException`):在将对象序列化为JSON字符串时,如果写入目标输出流时出现错误,会抛出IO异常。例如,如果目标输出流不可写或关闭,就会导致IO异常。 3. Jackson配置异常:如果Jackson库的配置出现问题,也可能导致序列化过程中抛出异常。例如,如果缺少必要的依赖或配置错误,就可能导致异常。 为了处理这些异常,可以使用try-catch语句来捕获并处理异常情况。下面是一个示例代码: ```java import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class Example { public static void main(String[] args) { ObjectMapper objectMapper = new ObjectMapper(); try { String json = objectMapper.writeValueAsString(new MyObject()); System.out.println(json); } catch (JsonProcessingException e) { // 处理序列化异常 e.printStackTrace(); } catch (IOException e) { // 处理IO异常 e.printStackTrace(); } } } ``` 在实际使用中,可以根据具体情况选择适当的异常处理策略,例如记录日志、返回错误信息或进行其他相应的处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值