如何使用带有 Gson 的 retrofit2 将空字符串视为 null

How to treat empty string as null using retrofit2 with Gson

我正在使用 Retrofit2Gson 从 public API 获得响应。

响应看起来像这样:

{"replies":[{"data":"value1"},{"data":"value2"}]}

但是当回复字段为空时,数据如下所示:

{"replies": ""}

因此,如果我将回复视为字符串,则在获取数组时会出现异常。当我把它当作一个数组时,当我得到一个空字符串时我会得到一个异常。

有没有办法解决它,以便我可以忽略该值,就好像它是 null 一样,当它是一个空字符串时?

我会手动解析它,但实际响应很大,我宁愿只使用 Gson 而不是为响应编写自定义解析。

您可以编写自定义反序列化器,在 JSON Array 的情况下使用 Gson 基本反序列化器反序列化它,在所有其他情况下您可以 return null 或空列表。看看下面的例子:

class RepliesJsonDeserializer implements JsonDeserializer<List<Reply>> {

    @Override
    public List<Reply> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        if (json.isJsonArray()) {
            JsonArray array = json.getAsJsonArray();
            List<Reply> replies = new ArrayList<>(array.size());
            array.forEach(item -> replies.add(context.deserialize(item, Reply.class)));

            return replies;
        }

        // in all other case empty list or null
        return Collections.emptyList();
    }
}

我假设您的 Pojo 如下所示(Reply 是列表中项目 class 的名称):

class Replies {

    @JsonAdapter(RepliesJsonDeserializer.class)
    private List<Reply> replies;

    // getters, setters, toString
}

如您所见,我们使用 @JsonAdapter 注释来注册我们的 RepliesJsonDeserializer 自定义实现。我建议 return Collections.emptyList() 始终只是为了拥有清晰的代码并避免 null-checking.