gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:07 24 4
gpt4 key购买 nike

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

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

在顶级对象级别,我希望 Gson 忽略 null 字段(例如,如果 lastnamenull,它不应该被序列化)。

但是在字段 opaqueData 中,我希望对 null 进行序列化,因为它应该是一个不透明数据 block 。所以使用 new 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 kind 是适应的结果。

浏览 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”或实际值。

关于java - Gson 会忽略 JsonElement 字段上的 @JsonAdapter 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52434317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com