Android: 解决后台返回 JSON 不规范导致类型不匹配的问题

  很多时候,后端返数据类型的时候都是看心情的,比如:


  我们解析一段 json 时常会建立好一个模型,比如下面的 data 一定是数组:

{
    "code":1,
    "msg":"获取数据成功",
    "data":[
        // 众多 Object...
    ]
}

  但不是所有的后端都会遵守规范。很多时候后端返的数据类型都是看心情的,比如没有数据的时候它会这样返回:

{
    "code":0,
    "msg":"没有数据",
    "data":""
}

  此时因为 data 是字符串而不是数组,会解析出错。

  我们可以写一个类型转换器,来解决后端返回数据不规范的问题。在这里为 空字符串 转 空数组。
  建立一个类 (这里取名为 EmptyString2ListTypeAdapter.java):

/**
 * Created by Silica on 8/30/2018.
 * ====
 * 将空字符串转换为空数组.
 */

class EmptyString2ListTypeAdapter implements JsonSerializer>, JsonDeserializer> {
    @Override
    public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            // 如果后台返回来的是 空字符串 或 null, 则返回空数组
            if (json.getAsString().equals("") || json.getAsString().equals("null")) {
                return new ArrayList<>();
            }
        } catch (Exception ignore) {
        }
        try {
            return new ArrayList<>();
        } catch (NumberFormatException e) {
            throw new JsonSyntaxException(e);
        }
    }

    @Override
    public JsonElement serialize(List src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.toString());
    }
}

  使用:
  假设你原来是这样用 Gson 的:

new GsonBuilder().create().fromJson(s, clazz);

  在里面多插一条:

new GsonBuilder()
 .registerTypeAdapter(List.class, new ListDefault0Adapter<>())
 .create().fromJson(s, clazz);

  这样就可以了。