如何使用带有 Gson 的 retrofit2 将空字符串视为 null
How to treat empty string as null using retrofit2 with Gson
我正在使用 Retrofit2
和 Gson
从 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.
我正在使用 Retrofit2
和 Gson
从 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.