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

我有一个使用Gson进行序列化的对象:

class User {
    String firstname;
    String lastname;
    JsonElement opaqueData;
}

在顶级对象级别,我希望Gson忽略空字段(例如,如果姓为空,则不应序列化它).

但是在opaqueData字段中,我希望对null进行序列化,因为应该将其序列化为不透明数据块.因此,使用新的GsonBuilder().serializeNulls().create().toJson(user)将不起作用.

但是@JsonAdapter也不起作用

class User {
    String firstname;
    String lastname;
    @JsonAdapter(NullAdapter.class)
    JsonElement opaqueData;
}

class NullAdapter extends TypeAdapter<JsonElement> {

    @Override
    public void write(JsonWriter out, JsonElement value) throws IOException {
        out.jsonValue(new GsonBuilder().serializeNulls().create().toJson(value));
    }

    @Override
    public JsonElement read(JsonReader in) throws IOException {
        // TODO Auto-generated method stub
        return null;
    }

}

看来适配器已被Gson忽略.

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

最佳答案
Gson不必理会其内部数据类型JsonElement.我不知道是否有任何意义,因为JsonElement类型是适应的结果.

看一下source code of Gson,您可以看到两种顶级方法:

对于任何物体

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

我认为,如果不复制上述方法1进行搜索的其余代码,这是显而易见的.在其执行路径中设置适配器(和查询适配器工厂).但是,还有类似的方法:

对于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”或实际值.

转载注明原文:java-Gson是否会忽略JsonElement字段上的@JsonAdapter? - 代码日志