• 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 }
  • 相关阅读:
    linux常用命令
    练习00004
    python学习第六天
    练习00003
    练习00002
    python学习第四天
    练习00001
    Linux_安装mysql踩坑日记
    Linux_更改远程登录端口以及禁止root用户登录
    redis_基础_基本使用
  • 原文地址:https://www.cnblogs.com/yoyotl/p/6933617.html
Copyright © 2020-2023  润新知