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 }
  • 相关阅读:
    面向对象(二)-特性
    面向对象(一)-初步认识
    函数(十)-内置模块
    函数(九)-包与模块
    函数(八)-闭包与装饰器
    函数(七)-嵌套作用域
    函数(六)-匿名函数
    CSS阴影效果(Box-shadow)用法趣味讲解
    css 实现div内显示两行或三行,超出部分用省略号显示
    js基础知识(一)--截取字符串
  • 原文地址:https://www.cnblogs.com/yoyotl/p/6933617.html
Copyright © 2011-2022 走看看