2017-10-27 9 views
1

Androidアプリケーションの開発。 私は自分のレスポンスを得るためにレトロフィットを使用しています。現在、私はすべてのタイプのフィールドを含むPOJOモデルクラスを作成しました(現実にはフィールドとメソッドがありますので、ここではそれらを単純化しました)。 Client.classから更新:オブジェクトのリストを異なるタイプにデシリアライズ

コード:拡張基底クラス現在Car.class

あるすべてのタイプ(Taxi.classVan.class)のため

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
     builder.readTimeout(30, TimeUnit.SECONDS); 
    OkHttpClient okHttpClient = builder.build; 
    Retrofit retrofit = new Retrofit.Builder() 
     .addConverterFactory(GsonConverterFactory.create()) 
     .client(okHttpClient) 
     .build(); 

私は何を達成したいことはある特定のモデル私Car.classは次のようになります。

public class Car { 
    public String type; 
    public String id; 
    public boolean isClean; 
    public int seats; 
    public int fuelTankCapacity; 
} 

私は車、バン、タクシーのモデルを持っていますサーバーから

public class Car { 
    public String type; 
    public String id; 
} 

public class Van extends Car { 
    public int fuelTankCapacity; 
} 

public class Taxi extends Car { 
    public boolean isClean; 
    public int seats; 
} 

が応答(JSON):このようなS

{ 
    "items": [{ 
      "type": "taxi", 
      "id": "1i2ilkad2", 
      "isClean": "true", 
      "seats": "5" 
     }, 
     { 
      "type": "van", 
      "id": "aopks21k", 
      "fuelTankCapacity": 76 
     }, etc... 
    ] 
} 

は、私はそれがインスタンスを改造する.addConverterFactory(new CarJSONConverter())のような行を追加すると何とか行われるべきであることを理解しているが、私はどのように考えています私は/ ..

答えて

1

クレートカスタムシリアル化をこのコンバータを実装する必要があります。このようにデシリアライズ:

static class CarDeserializer implements JsonDeserializer<Car> { 

     @Override 
     public Car deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
      JsonObject obj = json.getAsJsonObject(); 
      String type = obj.get("type").getAsString(); 
      if (type.equalsIgnoreCase("van")) { 
       // return van 
      } else { 
       // return taxe 
      } 
      return null; 
     } 
    } 

    static class CarSerializer implements JsonSerializer<Car> { 

     @Override 
     public JsonElement serialize(Car src, Type typeOfSrc, JsonSerializationContext context) { 
      JsonObject obj = new JsonObject(); 
      if (src instanceof Taxi) { 
       // code here 
      } else if (src instanceof Van) { 
       // code here 
      } 
      return obj; 
     } 
    } 

はそのgsonを使用するように改造を依頼カスタム・シリアライザ/デシリアライザで

Gson getGson() { 
     return new GsonBuilder().registerTypeAdapter(Car.class, new CarDeserializer()) 
       .registerTypeAdapter(Car.class, new CarSerializer()).create(); 
    } 

をgsonを作成します。いくつかの修正を加えた

Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(url) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create(getGson())) 
      .build(); 
+0

を、これが正解です。どうもありがとう! :) – user2532781

関連する問題