このブログ投稿http://blog.robinchutaux.com/blog/a-smart-way-to-use-retrofit/によると、より良い方法は、シリアライズ可能ではなくパーセル可能で解析することです。
しかし、Parceler ライブラリ ( https://github.com/johncarl81/parceler )を使用して解析をカスタマイズするにはどうすればよいですか?
GSON ライブラリでは、次のように実行できます。
public class GuestEntityDeserializer implements JsonDeserializer<GuestEntity> {
private static final String ID = "id";
private static final String FIRST_NAME = "firstname";
// other fields...
@Override
public GuestEntity deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
final GuestEntity guestEntity = new GuestEntity();
final JsonObject jsonObject = json.getAsJsonObject();
guestEntity.setId(jsonObject.get(ID).getAsString());
guestEntity.setFirstName(jsonObject.get(FIRST_NAME).getAsString());
guestEntity.setLastName(jsonObject.get(LAST_NAME).getAsString());
// and so on...
return guestEntity;
}
そして、次のように GsonBuilder を構成します。
final Gson gson = new GsonBuilder()
.registerTypeAdapter(GuestEntity.class, new GuestEntityDeserializer())
.create();
問題は、Retrofit と Parceler ライブラリを使用して json 文字列を解析する方法です。たとえば、次のモデルを持つ 2 つのオブジェクトが必要です。
@Parcel
public class MatchModel {
@SerializedName("id")
private String mId;
@SerializedName("first")
private String mFirst;
@SerializedName("last")
private String mLast;
@SerializedName("ilike")
private String mIlike;
@SerializedName("created_at")
private String mCreatedAt;
@SerializedName("liketo")
private String mLiketo;
@SerializedName("firstname")
private String mFirstName;
@SerializedName("lastname")
private String mLastName;
@SerializedName("birthday")
private String mBirthday;
// getters and setters
}
これを解析する必要があります:
{
"1277": {
"id": "322",
"first": "1294",
"last": "1277",
"ilike": "1",
"created_at": "2015-07-31 18:51:47",
"liketo": "1277",
"firstname": "Alex",
"lastname": "Alexov",
"birthday": null
},
"1312": {
"id": "951",
"first": "1294",
"last": "1312",
"ilike": "1",
"created_at": "2015-08-06 15:12:29",
"liketo": "1312",
"firstname": "Roman",
"lastname": "Romanov",
"birthday": "1990-06-23"
}
}