json字符串序列化exception处理

Posted 一沙世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 





以上是关于json字符串序列化exception处理的主要内容,如果未能解决你的问题,请参考以下文章

在将实体框架对象图序列化为 Json 时防止 ***Exception

spring security oauth2 认证端异常处理(基于前后分离统一返回json)

AFNewtorking 中的 JSON 序列化失败

异常和TCP通讯

JSON.Net 在使用 [JsonConvert()] 时抛出 ***Exception

C#对JSON的处理和JSON在JS的序列化