java - 根据字段动态创建对象

标签 java gson android

我从网络 API 收到一个像这样的 JSON:

{
  ...
  "foobar":
    {
      "type": "...",
      "keyTypeA": "value"
    }
}

foobar 根据其 type 字段具有不同的对象类型。 所以,foobar 可以是:

{
  "type": "typeA",
  "keyA1": "...",
  "keyA2": "...",
  ...
}

{
  "type": "typeB",
  "keyB1": "...",
  "keyB2": "...",
  ...
}

等等

我如何将这些 JSON 模型解析为我在此处定义的 POJO 类:

public class FoobarTypeBase {
    @SerializedName("type")
    public String type;
}

public class FoobarTypeA extends FoobarTypeBase {
    @SerializedName("keyA1")
    public SomeObject keyA1;
    @SerializedName("keyA2")
    public SomeObject keyA2;
}

public class FoobarTypeB extends FoobarTypeBase {
    @SerializedName("keyB1")
    public SomeObject keyB1;
    @SerializedName("keyB2")
    public SomeObject keyB2;
}

我想我必须处理 TypeAdapterFactoryTypeAdapter 但我不知道如何有效地完成它。

最佳答案

我通常使用 Retrofit + Gson 的组合,并这样做:

RuntimeTypeAdapterFactory<FoobarTypeBase> itemFactory = RuntimeTypeAdapterFactory
            .of(FoobarTypeBase.class, "type") // The field that defines the type
            .registerSubtype(FoobarTypeA.class, "foobar")
            .registerSubtype(FoobarTypeB.class) // if the flag equals the class name, you can skip the second parameter.

Gson gson = new GsonBuilder()
            .registerTypeAdapterFactory(itemFactory)
            .create();

然后我像这样初始化 Retrofit:

Retrofit.Builder builder = new Retrofit.Builder();
    builder.baseUrl(BASE_URL);
    builder.addConverterFactory(GsonConverterFactory.create(gson));

Retrofit retrofit = builder.build();

关于java - 根据字段动态创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44930797/

相关文章:

Android 帐户管理器不缓存 authToken

android - 有没有办法控制 Android Wear 表盘上交互模式的持续时间?

Java 调整我的分割框大小

java - 在 Android 中以自定义格式显示相对日期

java - 名称输出显示 "null"Java

java - 空 json 对象而不是 null,当没有数据时 -> 如何使用 gson 反序列化

java - GSON从json文件到对象

java - 非法访问错误 : Method is inaccessible to class

java - 在 Kotlin 中,GSON.fromJson(...) 如何设法改变现有对象的只读字段?

java - 等待线程不恢复