美好的一天。我在理解这一点时遇到了一些麻烦。我有一个JSON看起来像这样:如何使用自定义Gson解串器分析对象的嵌套JSON数组?
{
"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;
}
}
}
现在想象它有很多更多的数据。我如何创建自定义TypeAdapter
或JsonDeserializer
来解析List<IncludedModel>
?出于某种原因,我可以为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:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(IncludeModel.class, new IncludedTypeAdapter());
//gsonBuilder.registerTypeAdapter(new IncludedTypeAdapter());
gsonBuilder.serializeNulls();
Gson gson = gsonBuilder.create();
return gson;
这一点我通过GsonConverterFactory
改造上注册。
我越来越:
预计BEGIN_ARRAY但BEGIN_OBJECT第1分6292列路径$ .included [0]
我怀疑是因为我的改造响应<PositionResponse>
这是一个JsonObject
。
总结我的问题:如何使用我自己的自定义类型适配器对List<IncludeModel>
对象进行反序列化,并记住我的Retrofit服务的响应类型是PositionResponse
?非常感谢您的患者和答案。
为什么你需要一个自定义适配器?如果你的模型匹配json,你通常不需要一个。 – nasch
@nasch,因为如果你看包含对象,类型会动态改变,服务器返回的是其他嵌套对象,就像JSONAPI格式的“关系”标记一样,我会有很多难以维护的模型类所以最好将它们映射到自定义模型中。也用于学习目的,如果可能的话。 – irobotxxx