gpt4 book ai didi

java - 使用自定义类型适配器添加对象,gson 中的 jsonwriter

转载 作者:搜寻专家 更新时间:2023-10-30 20:59:42 25 4
gpt4 key购买 nike

gson 是一个很棒的库 - 它运行良好。有时我有自定义要求,并且可以制作和注册 TypeAdapters 和 TypeAdaptorFactories - 这也很有效。

然而,让我感到困惑的是如何委托(delegate)回 json 序列化......大多数时候我需要这个用于集合,但为了说明这一点 - 假设我有一个 pair 类,gson 显然会愉快地序列化,但是出于某种原因,我需要自己的自定义序列化程序。嗯...如果我的一对是

public class Pair
{
public final Object First;
public final Object Second;
public Pair( Object first, Object second) {this.first = first; this.second = second};
}

如果我为此写了一个类型适配器 - 你会希望写函数看起来像:

public void write( JsonWriter out, Pair pair )
{
out.beginObject();
out.name( "first");
out.value( pair.first ); // can't do this
out.name( "second");
out.value( pair.second); // or this
out.endObject();
}

所以您可以看到问题 - 我不知道第一个和第二个的类型,也不知道它们是如何序列化的。我可以使用 gson.toJson 序列化第一个和第二个 - 但如果我将它们作为字符串添加到编写器,它们将被转义。有一个 gson.tojson 函数接受一个值和一个 writer - 但它也接受一个 typetoken - 我没有。我有点觉得我应该从某个地方获得另一种类型的适配器 - 但是当我只有一个对象列表时......我从哪里得到它?我只是获取对象的适配器吗?

我有点迷茫?当然这是最常见的用例?大多数自定义序列化器将用于奇怪的 T 列表或 T 树或其他东西,而你真的不知道列表中有什么,除此之外它继承自 T...所以你需要能够委托(delegate)回以某种方式序列化?

无论如何 - 如果有人能告诉我如何编写上述函数,我将不胜感激!

最佳答案

在这种情况下最好使用 JsonSerializer而不是 TypeAdapter ,原因很简单,序列化器可以访问它们的序列化上下文:

public class PairSerializer implements JsonSerializer<Pair> {

public PairSerializer() {
super();
}

@Override
public JsonElement serialize(final Pair value, final Type type,
final JsonSerializationContext context) {
final JsonObject jsonObj = new JsonObject();
jsonObj.add("first", context.serialize(value.getFirst()));
jsonObj.add("second", context.serialize(value.getSecond()));

return jsonObj;
}
}

上面的示例代码说明了如何将目标对象的序列化委托(delegate)回主编码器。这样做的主要优点(除了避免复杂的解决方法之外)是您仍然可以利用可能已在主上下文中注册的其他类型适配器和自定义序列化程序。请注意,序列化程序和适配器的注册使用完全相同的代码:

// With adapter
final Gson gson = new GsonBuilder().registerTypeAdapter(Pair.class,
new PairAdapter()).create();

// With serializer
final Gson gson = new GsonBuilder().registerTypeAdapter(Pair.class,
new PairSerializer()).create();

如果您发现需要坚持使用适配器,那么您可以使用嵌入式 Gson 代理为您序列化 Pair 属性,缺点是您无法访问您在父 Gson 代理上进行的自定义注册:

public class PairAdapter extends TypeAdapter<Pair> {
final Gson embedded = new Gson();

public PairAdapter() {
super();
}

@Override
public void write(final JsonWriter out, final Pair value)
throws IOException {
out.beginObject();

out.name("first");
embedded.toJson(embedded.toJsonTree(value.getFirst()), out);

out.name("second");
embedded.toJson(embedded.toJsonTree(value.getSecond()), out);

out.endObject();
}

@Override
public Pair read(JsonReader in) throws IOException {
throw new UnsupportedOperationException();
}
}

关于java - 使用自定义类型适配器添加对象,gson 中的 jsonwriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17005675/

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