我正在使用Gson,我处于一种情况,我必须缩小某些Json字符串的大小。我希望通过让它不将null对象,只有空值和空列表和数组放入Json字符串中来实现。如何让GSON忽略空或空对象以及空阵列和列表?
有没有简单的方法来做到这一点?让我澄清一下:我希望所有说:emptyProp:{}或emptyArray:[]被跳过。我想要任何只包含空的属性的对象被跳过。
我正在使用Gson,我处于一种情况,我必须缩小某些Json字符串的大小。我希望通过让它不将null对象,只有空值和空列表和数组放入Json字符串中来实现。如何让GSON忽略空或空对象以及空阵列和列表?
有没有简单的方法来做到这一点?让我澄清一下:我希望所有说:emptyProp:{}或emptyArray:[]被跳过。我想要任何只包含空的属性的对象被跳过。
默认情况下排除空值,只要您不将serializeNulls()设置为您的GsonBuilder。
一个空列表的方法是创建一个JsonSerializer
class CollectionAdapter implements JsonSerializer<Collection<?>> {
@Override
public JsonElement serialize(Collection<?> src, Type typeOfSrc, JsonSerializationContext context) {
if (src == null || src.isEmpty()) // exclusion is made here
return null;
JsonArray array = new JsonArray();
for (Object child : src) {
JsonElement element = context.serialize(child);
array.add(element);
}
return array;
}
}
然后将其注册
Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(Collection.class, new CollectionAdapter()).create();
你确定上述代码是正确的吗?当我尝试它时,似乎没有影响任何东西? – bashoogzaad 2015-07-15 14:13:30
是的,直到我将'Collection >'更改为'列表>',这对我来说才起作用,然后它就像应该那样工作 – 2015-12-05 23:52:24
根据PomPom一个HashMap可以通过连载:
class MapAdapter implements JsonSerializer<Map<?, ?>> {
@Override
public JsonElement serialize(Map<?, ?> src, Type typeOfSrc,JsonSerializationContext context) {
if (src == null || src.isEmpty())
return null;
JsonObject obj = new JsonObject();
for (Map.Entry<?, ?> entry : src.entrySet()) {
obj.add(entry.getKey().toString(), context.serialize(entry.getValue()));
}
return obj;
}
}
是不是默认行为? – mhusaini 2012-08-13 20:58:04
不,它放入空阵列等。 – Joe 2012-08-13 21:31:46
“它放入空阵列等” - ?我建议发布你正在谈论的完整的最简单的例子。该文档说,“序列化时,从输出中跳过空字段”(但如果这不正确,我不会感到惊讶)。 – 2012-08-13 22:30:48