zoukankan      html  css  js  c++  java
  • json字符串序列化exception处理

    一、背景:

    使用REST接口接收远端传送过来的Json格式String,需要把这个String序列化成响应的对象。

    二、问题:

    对方封装了一个错误的json格式过来,程序就挂了……

    三、似乎解决:

    通过外交手段严令对方封装标准的json格式字符串,看起来测试又通过了……

    四、反思:

    这样肯定是不行的,实际上线以后,万一有人恶意的往接口发一条错误的String来,程序就挂了也说不过去啊。
    我在写代码的时候没有收到处理exception的提示,说明这是一个“不可查异常”,例如RuntimeException。
    那就捕获这个异常并处理就好了。

    五、彻底解决:
    先看看原有的转换方法:

    1 public <T> T GsonToBean(String gsonString, Class<T> cls) {
    2   T t = null;
    3   if (gson != null) {
    4     t = gson.fromJson(gsonString, cls);
    5   }
    6   return t;
    7 }

    跟踪一下fromJson方法

    1 public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException {
    2   Object object = fromJson(json, (Type) classOfT);
    3   return Primitives.wrap(classOfT).cast(object);
    4 }

    这个方法抛出了一个JsonSyntaxException

    那就捕获吧!
    改进的转换方法:

    public <T> T GsonToBean(String gsonString, Class<T> cls) {
      T t = null;
      if (gson != null) {
        try {
          t = gson.fromJson(gsonString, cls);
        } catch (JsonSyntaxException e) {
        System.out.println("json parse err!!!");
        }
    
      }
      return t;
    }

    bingo!任你传什么格式的String,程序都不会挂了。我得到了一句打印"json parse err!!!"

    如果你不想在这个方法中处理这个exception,想在更上层的业务逻辑中处理它,那就throws吧。

    1 public <T> T GsonToBean(String gsonString, Class<T> cls) throws JsonSyntaxException {
    2   T t = null;
    3   if (gson != null) {
    4     t = gson.fromJson(gsonString, cls);
    5   }
    6   return t;
    7 }
  • 相关阅读:
    WEB专用服务器的安全设置的实战技巧IIS设置
    Mysql服务无法启动的1067错误解决
    mysql noinstall 安装
    由于无法创建应用程序域,因此未能执行请求解决方案汇总
    黑客经验谈系列之入侵3389起源完整篇
    几个js写word的参考
    WIndows系统下安装mysqlnoinstall版本
    用微软安全工具加固网站安全 (URLScan Tool & IIS Lock Tool)
    Windows 2000 网络服务器安装完全手册
    工作五年的大佬分享他做实习生的那些感悟
  • 原文地址:https://www.cnblogs.com/yoyotl/p/6933617.html
Copyright © 2011-2022 走看看