2017-07-05 5 views
1

に基づいてオブジェクトを作成します。 ので、foobarができ:は動的に私はこの1つのようなJSON APIのネットワークから受信したフィールド

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

または

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

など

私はここで定義された私のPOJOクラスにこれらのJSONモデルを解析することができますどのように

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; 
} 

I私はTypeAdapterFactoryとを扱わなければならないと思います10しかし、私はそれを効率的に行う方法は知られていません。

+0

はGSONライブラリを使用してみてください。 'newGson().. fromJson();' – Manindar

+0

@Manindarこのソリューションは、親オブジェクトに 'foobar'の未処理のJSONオブジェクトを保持し、解析する必要があります。これはうまくいくが、効率的でもエレガントではない。 – riot

答えて

1

私は通常、レトロフィット+ 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.Builder builder = new Retrofit.Builder(); 
    builder.baseUrl(BASE_URL); 
    builder.addConverterFactory(GsonConverterFactory.create(gson)); 

Retrofit retrofit = builder.build(); 
関連する問題