关于fastjson转换对象失败的问题

背景:RESTFul项目,框架为SpringMVC+MyBatis,SpringMVC中配置的message-converters为阿里的fastjson。

版本:spring4.1.6,fastjson1.2.7

最近一个项目中遇到一个问题,前端请求发生异常如下:

java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com......ActAddressVo
    at com......ActivityController.updateActAddress(ActivityController.java:166) ~[ActivityController.class:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_79]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_79]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_79]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_79]
......

异常信息说明JSON对象不能转换为ActAddressVo类型对象

controller层关键代码如下:

    @RequestMapping(value="updateActAddress",method=RequestMethod.POST)
    private ListResponse<ActAddressVo> updateActAddress(@RequestBody List<ActAddressVo> actAddressVoList){
        actAddressVoList = activityService.updateActAddress(actAddressVoList);
        response.setData(actAddressVoList);
        return response;
    }

service层关键代码如下:

 1 @Transactional
 2 @Override
 3 public List<ActAddressVo> updateActAddress(List<ActAddressVo> actAddressVoList) {
 4     List<ActAddressVo> retList = new ArrayList<ActAddressVo>();
 5     Iterator<ActAddressVo> iter = actAddressVoList.iterator();
 6     while(iter.hasNext()) {
 7         ActAddressVo item = iter.next(); 
8
// TODO update addr 9 } 10 }

debug发现第7行转换出错,然后查了资料没找到原因,故而根据错误原因思考既然是fastjson转换出错,那就在这一步用一个专门的转换。

经过查阅资料发现可用JSON.parseObject(String text, Class<T> clazz)来进行强制转换,故将第7行修改为如下:

ActAddressVo item = (ActAddressVo) JSON.parseObject(iter.next().toString(), ActAddressVo.class);

然后运行发现问题依然没有解决,还是报同样的错误,晚上加班也尝试了其他办法都没有解决。

第二天早上来时突然想到会不会是因为该JSON对象的toString方法的问题,于是将iter.next()赋值给一个Object对象,然后再调用其toString方法,代码如下:

 1 @Transactional
 2 @Override
 3 public List<ActAddressVo> updateActAddress(List<ActAddressVo> actAddressVoList) {
 4     List<ActAddressVo> retList = new ArrayList<ActAddressVo>();
 5     Iterator<ActAddressVo> iter = actAddressVoList.iterator();
 6     while(iter.hasNext()) {
 7         Object obj = iter.next();
 8         ActAddressVo item = (ActAddressVo) JSON.parseObject(obj.toString(), ActAddressVo.class);
 9         // TODO update addr
10     }
11 }

运行OK,问题解决。

 

转载于:https://www.cnblogs.com/renzhigen12/p/5473906.html

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值