问题

前端传Json格式数据到后台后,springmvc报

org.springframework.http.converter.HttpMessageNotReadableException:* JSON parse error: Can not deserialize instance of java.lang.String out of START_OBJECT token;* nested exception is com.fasterxml.jackson.databind.JsonMappingException:* Can not deserialize instance of java.lang.String out of START_OBJECT token*  at [Source: java.io.PushbackInputStream@6822f8aa; line: 1, column: 88] (through reference chain: com.xxx.XXXDto["employees"])

方案

我们要解决这个问题,可以使用Spring中的统一异常处理方式 里面介绍的一种

@ExceptionHandler({HttpMessageNotReadableException.class, JsonMappingException.class, HttpMediaTypeNotSupportedException.class})@ResponseBody@ResponseStatus(HttpStatus.BAD_REQUEST)public Map<String,Object> exceptionHandler(Exception ex){Map<String,Object> map = new HashMap<>(3);try{map.put("code","400");map.put("msg",ex.getMessage());return map;}catch (Exception e){log.error("exception handler error",e);map.put("code","400");map.put("msg",e.getMessage());return map;}}

解决过程遇到的问题

上面方法虽然能够处理JSON格式错误的问题,但是返回给前端的数据内容就是下面格式

JSON parse error: Can not deserialize instance of java.lang.String out of START_OBJECT token;  nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token  at [Source: java.io.PushbackInputStream@6822f8aa; line: 1, column: 88] (through reference chain: com.xxx.XXXDto["callBackUrl"])

一眼看不到是什么问题,就算是熟悉了这个错误,也不能马上找到是哪个地方出的问题,因为我们需要对上面的数据进行加工后再返回给前端

最终解决问题

我们debug源码发现,改异常是在springframework的org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter里面抛出的

异常是JsonMappingException extends JsonProcessingException,springmvc里抛出了HttpMessageNotReadableException,因此,我们只需要在统一异常处理的地方添加对应处理逻辑,就可以友好返回给前端

@ExceptionHandler({HttpMessageNotReadableException.class, JsonMappingException.class, HttpMediaTypeNotSupportedException.class})@ResponseBody@ResponseStatus(HttpStatus.BAD_REQUEST)public Map<String,Object> exceptionHandler(Exception ex){Map<String,Object> map = new HashMap<>(3);try{if(ex instanceof HttpMessageNotReadableException&& ex.getMessage().indexOf("JSON parse error:")>-1){map.put("code","400");String message=ex.getMessage();int beginIndex=message.indexOf("XXXDto[\"");int endIndex=message.indexOf("\"])",beginIndex);message="参数"+message.substring(beginIndex+22,endIndex)+" 格式错误";map.put("msg",message);}else{map.put("code","400");map.put("msg",ex.getMessage());}return map;}catch (Exception e){log.error("exception handler error",e);map.put("code","400");map.put("msg",e.getMessage());return map;}}

JSON格式错误报JSON parse error:相关推荐

  1. (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)...

    原文地址:解决fasterxml中string字符串转对象json格式错误问题 com.fasterxml.jackson.databind.ObjectMapper mapper = new com ...

  2. FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换

    fastJson对于json格式字符串的解析主要用到了一下三个类: JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换. JSONObject:fas ...

  3. fastjson 检测json格式_FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换...

    fastJson对于json格式字符串的解析主要用到了一下三个类: JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换. JSONObject:fas ...

  4. SpringCloud工作笔记047---FastJson解析多级JSON_FastJson解析嵌套JSON_FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换

    JAVA技术交流QQ群:170933152 解析嵌套json,这里说一下: //下面可以通过解析多级json的方式,获取数据,插入到数据库 //JSONObject userJsonObj = JSO ...

  5. bison版本问题导致编译报错:‘parse.error‘ is not used

    bison版本问题导致编译报错:'parse.error' is not used 'parse.error' 问题定位和修正 问题发现 问题调查与定位 更新bison/flex版本 问题修正 一些参 ...

  6. 数据传输:json格式序列化与反序列化(将类转化为json格式与将json格式转化为类)

    数据传输:json格式序列化与反序列化(将类转化为json格式与将json格式转化为类) 在最近的实验中,使用了json来传送客户端与服务端的信息,之前原本想使用自己定义的格式,但是使用json可以将 ...

  7. Json格式错误问题:加注释引起的报错

    报错内容: JSON parse error: Unexpected character ('/' (code 47)): maybe a (non-standard) comment? (not r ...

  8. 把执行结果转成json对象报错_于一次JSON格式错误 之 手把手带你走一波FastJSON将对象转成JSON字符串流程...

    一.前言 最近老大说要新增一个试用广告的功能,我巴拉巴拉的从之前推送广告那里将代码cv过来,然后跟老大说搞定了!过一会老大说返回的json格式不对!于是乎我瞧了瞧: { "adsArea1& ...

  9. android判断是否json格式,Android判断json格式将错误信息提交给服务器

    开发中发现, 服务器偶尔会发送错误格式 json 给 Android 客户端, 导致 Android 客户端 json解析失败, 应用异常. 并非服务器有意坑客户端, 而是客户端请求服务器数据时, 除 ...

  10. Json格式转换报java.lang.StackOverflowError

    栈溢出就是缓冲区溢出的一种. 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果.程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区.如果向缓冲 ...

最新文章

  1. Oracle对sum求和进行if,Excel中sumif函数和sumifs函数进行条件求和的异同
  2. from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver,
  3. 用TensorFlow基于神经网络实现井字棋(含代码)
  4. React学习小结(二)
  5. urllib2库的基本使用
  6. 一篇价值过百万的日志
  7. android8 twrp 小米6,小米6一键刷入TwrpRecovery工具
  8. 二阶压控电压源低通滤波器的传递函数
  9. 揭秘淘宝286亿海量图片存储与处理架构(转)
  10. 保乐力加在四川峨眉山兴建中国首家麦芽威士忌酒厂
  11. 两台win10电脑网线直连,使用Synergy实现鼠标键盘共享设置
  12. Hadoop回顾:(一)Hadoop生态系统简介
  13. Android Q 获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID)
  14. 计算机锁屏域策略,域组策略锁屏界面设置不生效
  15. python怎么群发邮件_python群发邮件怎么做
  16. 从执行计划的预估行数看执行计划是否正确
  17. 【原】计算机Tools vs 学习资料
  18. 基于ijkplayer实现低延迟直播播放器
  19. 腾讯开源 Kotlin 高性能特效动画组件!
  20. Linux cp命令的使用方法与参数含义

热门文章

  1. jsp中对jstl一些标签的引用方式
  2. DataTable转成字符串复制到txt文本
  3. android 颜色测试,颜色 大师 (Color Sense Master) - 颜色测试
  4. ActiveMQ(二)——常用api、持久化、签收模式、以及常见问题
  5. 最常用的springmvc注解使用技巧
  6. 分布式文件存储FastDFS之安装Nginx实现文件访问
  7. Spring Cloud Eureka详解
  8. Python中流程控制-for循环(序列/字典举例)
  9. 10.3. TUI (Text User Interface)
  10. Silverlight 简介 Part.1(理解 Siverlight)