如何在JSON反序列化时进行容错处理

更新时间:2022-05-11 11:33:31

e签宝接口返回的JSON数据和e签宝回调通知推送的JSON数据,会某些特殊情况或业务的发展出现参数字段的增减或JSON键值对的增减。

开发者需要在以下几个方面考虑参数的兼容性:

  • 返回参数中新增 JSON 键值对时,JSON反序列化需考虑字段属性映射绑定兼容性。
  • 返回参数中JSON 键值对的值为空(null或"")时,需考虑对象或数组的取值兼容性。
  • e签宝 API 轻易不会去除请求和响应中已经存在的参数或 JSON 键值对,若有会提前进行变更通知,如:开放平台发布公告。
  • 部分情况下,同一个接口返回的参数或同一事件推送的回调参数,会因条件的不同造成返回参数不同的情况。这类不同通常在具体接口文档和具体回调通知文档中均有标注。

综上所述,为避免JSON反序列化时可能出现因JavaBean中无某个字段属性造成解析报错,我们建议开发者在进行JSON反序列化时参考以下方法进行参数容错处理。

假设 JSON 和 User 如下:

// JSON 数据
{"name":"张三","address":"杭州市西湖区"}

// JavaBean 结构
public class User {
    private String name;
}

Java 语言中 JSON 反序列化转JavaBean 示例代码如下:

示例代码

备注说明

Gson

User user = new Gson().fromJson(jsonStr, User.class);

json中的某字段在Bean中没有,无法匹配时,不会报错抛出异常。

fastjson

User user = JSON.parseObject(jsonStr, User.class);

json中的某字段在Bean中没有,无法匹配时,不会报错抛出异常。

Jackson

ObjectMapper objMapper = new ObjectMapper();

// jsonToBean时,json中的某字段在Bean中没有,无法匹配时,忽略此字段,不抛出异常

objMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

User user = objMapper.readValue(jsonStr, User.class);

如果不设置

objMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

会出现以下报错:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:

Unrecognized field "address" (class Test$User),

not marked as ignorable (one known property: "name"])

Java 开发者如果使用的非 Gson 、 fastjson 和 Jackson,请开发者自行进行容错处理。

非 Java 开发者请结合各自开发语言进行容错处理。

我要纠错