gpt4 book ai didi

java - 如何在 Gson 中实现 TypeAdapterFactory?

转载 作者:IT老高 更新时间:2023-10-28 20:39:38 26 4
gpt4 key购买 nike

如何实现类型 TypeAdapterFactory在 Gson ?

create 的主要方法是泛型的。为什么?

注册方法registerTypeAdapterFactory()不接收类型参数。那么,Gson如何知道工厂处理了哪些类呢?

我应该为多个类实现一个工厂,还是可以为多个类实现一个工厂?

如果我为多个类实现一个工厂,那么在域外类型参数的情况下我应该返回什么?

最佳答案

当您注册一个常规类型适配器 (GsonBuilder.registerTypeAdapter) 时,它只会为该特定类生成一个类型适配器。例如:

public abstract class Animal { abstract void speak(); }
public class Dog extends Animal {
private final String speech = "woof";
public void speak() {
System.out.println(speech);
}
}

// in some gson related method
gsonBuilder.registerTypeAdapter(Animal.class, myTypeAdapterObject);
Gson g = gsonBuilder.create();
Dog dog = new Dog();
System.out.println(g.toJson(dog));

如果你这样做了,那么 Gson使用您的myTypeAdapterObject ,它将使用 Object 的默认类型适配器.

那么,如何制作可以转换任何 Animal 的类型适配器对象Json 的子类?创建 TypeAdapterFactory !工厂可以使用泛型类型和 TypeToken 进行匹配类(class)。如果您的 TypeAdapterFactory 应该返回 null不知道如何处理该类型的对象。

另一件事TypeAdapterFactory可用于您不能以任何其他方式连接适配器。默认情况下,Gson 不会通过您的 Gson实例到 readwrite TypeAdapter的方法.所以如果你有一个像这样的对象:

public class MyOuterClass {
private MyInnerClass inner;
}

没有办法写你的TypeAdapter<MyOuterClass>知道如何使用您的TypeAdapter<MyInnerClass>不使用 TypeAdapterFactory . TypeAdapterFactory.create方法确实通过了 Gson实例,它可以让你教你的TypeAdapter<MyOuterClass>如何序列化 MyInnerClass字段。


一般来说,这里是开始编写 TypeAdapterFactory 实现的一个很好的标准方法。 :

public enum FooAdapterFactory implements TypeAdapterFactory {
INSTANCE; // Josh Bloch's Enum singleton pattern

@SuppressWarnings("unchecked")
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (!Foo.class.isAssignableFrom(type.getRawType())) return null;

// Note: You have access to the `gson` object here; you can access other deserializers using gson.getAdapter and pass them into your constructor
return (TypeAdapter<T>) new FooAdapter();
}

private static class FooAdapter extends TypeAdapter<Foo> {
@Override
public void write(JsonWriter out, Foo value) {
// your code
}

@Override
public Foo read(JsonReader in) throws IOException {
// your code
}
}
}

关于java - 如何在 Gson 中实现 TypeAdapterFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307382/

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