おはようございます。私はこれを理解するのに少し苦労している。オブジェクトのネストされたJSON配列をカスタムGsonデシリアライザで解析するにはどうすればよいですか?
{
"data": [
{
"id": "43",
"type": "position",
"attributes": {
"address-id": "1",
"employer-id": "11"
}
}
],
"included": [
{
"id": "1",
"type": "address",
"attributes": {
"line-1": "21 london london",
"line-2": "",
"line-3": "",
"locality": "",
"region": "London",
"post-code": "",
"country": "UK",
"latitude": "",
"longitude": ""
}
},
{
"id": "11",
"type": "employer",
"attributes": {
"title": "Mr",
"first-name": "S",
"last-name": "T"
}
}
]
}
そして、私のレトロフィット・コールは次のとおりです:
@GET("/api/positions")
Single<PositionResponse> getPosition();
そして、私のPositionResponse
クラス:
public class PositionResponse {
@SerializedName("data")
@Expose
private List<DataResponse> data;
@SerializedName("included")
@Expose
private List<IncludedModel> included;
public List<DataResponse> getData() {
return data;
}
public void setData(List<DataResponse> data) {
this.data = data;
}
public List<IncludedModel> getIncluded() {
return included;
}
public void setIncluded(List<IncludedModel> included) {
this.included = included;
}
}
}
は、今では多くのデータを持っている想像し、私はこのようになりますJSONを持っています。 List<IncludedModel>
を解析するためのカスタムTypeAdapter
またはJsonDeserializer
を作成するにはどうすればよいですか?何らかの理由でObject
のカスタムJsonDeserializer
またはTypeAdapter
を作成することができますが、List
になると、それを動作させることができないようです。次のように
私TypeAdapter
は次のとおりです。
public class IncludedTypeAdapter extends TypeAdapter<ArrayList<IncludedModel>> {
@Override
public void write(JsonWriter out, ArrayList<IncludedModel> value) throws IOException {
}
@Override
public ArrayList<IncludedModel> read(JsonReader in) throws IOException {
ArrayList<IncludedModel> list = new ArrayList<>();
IncludedModel model = new IncludedModel();
Gson gson = new Gson();
in.beginArray();
String id = null;
//in.beginObject();
while(in.hasNext()){
JsonToken nextToken = in.peek();
if(JsonToken.BEGIN_OBJECT.equals(nextToken)){
in.beginObject();
} else if(JsonToken.NAME.equals(nextToken)){
if(JsonToken.NAME.name().equals("id")){
id = in.nextString();
model.setId(id);
} else if(JsonToken.NAME.name().equals("type")){
String type = in.nextString();
model.setMytype(type);
switch (type) {
case BaseModelType.Employer:
EmployerResponse employer = gson.fromJson(in, EmployerResponse.class);
model.setEmployer(employer);
break;
}
}
}
}
list.add(model);
return list;
}
と私は私のGsonに登録します。私はGsonConverterFactory
を通じて改造に登録
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(IncludeModel.class, new IncludedTypeAdapter());
//gsonBuilder.registerTypeAdapter(new IncludedTypeAdapter());
gsonBuilder.serializeNulls();
Gson gson = gsonBuilder.create();
return gson;
。
私は取得しています:
期待BEGIN_ARRAYしかしBEGIN_OBJECTは$ .included行1列6292のパスで、私は私のレトロフィット応答がある
<PositionResponse>
あるためである疑いが[0]
だったがJsonObject
。
私の質問を要約すると、私のRetrofitサービスの応答タイプがPositionResponse
であることを念頭に置いて、独自のカスタムタイプのアダプターでList<IncludeModel>
オブジェクトを逆直列化するにはどうすればいいですか?あなたの患者と答えに感謝します。
あなたが必要な理由カスタムアダプターはまったくですか?モデルがjsonと一致する場合は、一般的にモデルは必要ありません。 – nasch
@nasch includeオブジェクトを見ると、型が動的に変化し、JSONAPI形式の "relationship"タグのように、サーバの戻り値が他の入れ子になっているオブジェクトなので、保持しにくいモデルクラスがたくさんあるのでカスタムモデルでそれらをマップするほうがよいでしょう。また、学習目的のために、そうすることが可能な場合。 – irobotxxx