【问题标题】:How to treat empty string as null using retrofit2 with Gson如何使用带有 Gson 的 Retrofit2 将空字符串视为 null
【发布时间】:2019-04-16 22:34:21
【问题描述】:

我正在使用Retrofit2Gson 来获得来自公众API 的回复。

响应看起来像这样:

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

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

{"replies": ""}

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

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

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

【问题讨论】:

    标签: java json gson retrofit2 json-deserialization


    【解决方案1】:

    您可以编写自定义反序列化器,在 JSON Array 的情况下使用 Gson 基本反序列化器对其进行反序列化,在所有其他情况下,您可以返回 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 Replies {
    
        @JsonAdapter(RepliesJsonDeserializer.class)
        private List<Reply> replies;
    
        // getters, setters, toString
    }
    

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

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2016-09-02
      • 2019-12-24
      相关资源
      最近更新 更多