【发布时间】:2017-10-19 05:23:49
【问题描述】:
我在请求正文中收到一个无效的 json(列表末尾的额外逗号),它正在被 GSON 库成功反序列化。经过检查,我看到 GSON 最后插入了一个 NULL 对象。
{
"content": "Test 2",
"timestamp": 1494311947530,
"entities": [
{"name": "entity1"},
{"name": "entity2"},
{"name": "entity3"},
{"name": "entity4"},
{"name": "entity5"},
]
}
有没有一种方法可以指示 GSON 不接受无效的 json 或从 JsonArray 中删除 NULL 对象。
我已尝试为 Set.class 注册类型适配器,但我无法继续使用此解决方案,因为无法获取参数化对象的 Type。
public class RemoveNullCollectionSerializer<T> implements JsonDeserializer<Set<T>> {
@Override
public Set<T> deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonArray elements = jsonElement.getAsJsonArray();
Set<T> result = new HashSet();
for (JsonElement element : elements) {
if (element.isJsonNull()) continue;
T value = (T) context.deserialize(element, Object.class);
result.add(value);
}
return result;
}
}
我正在尝试不注册自定义适配器,因为项目中有很多模型,每个模型都需要一个适配器,这将是一项艰巨的任务。
【问题讨论】:
-
可以使用正则表达式从序列化字符串中删除无效逗号。恐怕我不知道确切的语法。
-
json 是来自 API 还是什么?只是想弄清楚你是如何收到无效的 json 的。我不知道 Gson 中有任何内置函数允许您跳过空值(自定义反序列化程序除外),但是,Genson (owlike.github.io/genson) 的工作方式非常相似,但实际上 确实如此 允许您跳过空值。
-
这是向用户公开的公共 api 的一部分。由于应用程序中的错误导致 API 端点抛出 NPE,因此从用户应用程序接收到 json。服务高度依赖GSON,用Genson替代有点困难。
标签: java spring-boot gson