Gson是否会忽略JsonElement字段上的@JsonAdapter?

时间:2018-09-20 22:42:35

标签: java gson adapter

我有一个要使用for (int i = 0; i < block.Length; i++) { if (block[i] < 32) { block[i] = 0x20; } } 进行序列化的对象:

Gson

在顶级对象级别,我希望class User { String firstname; String lastname; JsonElement opaqueData; } 忽略Gson字段(例如,如果nulllastname,则不应对其进行序列化。)

但是在字段null中,我希望opaqueData进行序列化,因为它应该是不透明数据块。因此,使用null无效。

但是new GsonBuilder().serializeNulls().create().toJson(user)也不起作用

@JsonAdapter

似乎适配器被Gson忽略。

这是预期的行为吗?在没有为整个User类创建适配器然后手动序列化每个字段的情况下,如何做到这一点?

1 个答案:

答案 0 :(得分:3)

Gson不会去适应其内部数据类型JsonElement。我不知道是否有任何意义,因为JsonElement类型是适应的结果。

浏览source code of Gson时,您可以看到两种顶级方法:

对于任何对象

public String toJson(Object src) {
    if (src == null) {
        return toJson(JsonNull.INSTANCE);
    }
    return toJson(src, src.getClass());
}

我认为不复制上述方法的其余代码就很明显,上述方法之一在其执行路径中具有搜索和设置适配器(并查询适配器工厂)的功能。但是还有类似的方法:

对于JsonElement

public String toJson(JsonElement jsonElement) {
    StringWriter writer = new StringWriter();
    toJson(jsonElement, writer);
    return writer.toString();
}

,对于该执行路径,没有搜索,也没有将任何适配器设置为JsonElement都不再适用。

因此,当Gson命中任何JsonElement时,它只会将ti序列化为格式化字符串,并且不会影响任何适配器。

如果您确实需要序列化这样的内容,也许可以为JsonElement创建一个包装类,例如:

public class JsonElementWrapper {
    public JsonElement jsonElement;
}

并调整您的TypeAdapter以使其适应“ null”或实际值。