Android 如何使用自定义Gson反序列化器解析对象的嵌套JSON数组?
大家好。我理解这一点有点困难。我有一个JSON,看起来像这样:Android 如何使用自定义Gson反序列化器解析对象的嵌套JSON数组?,android,gson,Android,Gson,大家好。我理解这一点有点困难。我有一个JSON,看起来像这样: { "data": [ { "id": "43", "type": "position", "attributes": { "address-id": "1", "employer-id": "11" } } ], "included"
{
"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();
现在想象一下,它有更多的数据。如何创建自定义TypeAdapter或JsonDeserializer来解析列表?出于某种原因,我可以为对象创建一个自定义JsonDeserializer或TypeAdapter,但当涉及到列表时,我似乎无法让它工作
我的TypeAdapter如下所示:
公共类IncludedTypeAdapter扩展了TypeAdapter{
@凌驾
public void writeJsonWriter out,ArrayList值抛出IOException{
}
@凌驾
抛出IOException中的公共ArrayList readJsonReader{
ArrayList=新的ArrayList;
IncludedModel=新的IncludedModel;
Gson Gson=新Gson;
in.beginArray;
字符串id=null;
//in.beginObject;
whilein.hasNext{
JsonToken nextToken=in.peek;
ifJsonToken.BEGIN\u OBJECT.equalsnextToken{
in.beginObject;
}else ifJsonToken.NAME.equalsnextToken{
ifJsonToken.NAME.NAME.equalsid{
id=in.nextString;
model.setIdid;
}else ifJsonToken.NAME.NAME.equalstype{
字符串类型=in.nextString;
model.setMytypetype;
开关类型{
案例BaseModelType。雇主:
EmployerResponse employer=gson.fromJsonin,EmployerResponse.class;
model.setEmployeerEmployer;
打破
}
}
}
}
list.addmodel;
退货清单;
}
我向我的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_数组,但在第1行第6292列path$处为BEGIN_对象。包括[0]
我怀疑这是因为我的改装响应是JsonObject
总结一下我的问题:如何使用我自己的自定义类型适配器反序列化列表对象,记住我的改装服务的响应类型是PositionResponse?非常感谢您的患者和回答。如果您使用JsonDeserializer使用JSON树模型,这很容易。纯类型适配器也有点过火是的,我认为,因为它仍然是面向树的,在JSON文档最简单的情况下,您可以使用类似的方法进行更多的解释,但您的情况略有不同 我假设您希望有如下映射: 抽象类元素{ 最终字符串id=null; 私有元素{ } 静态最终类地址 扩展元素{ @SerializedNameline-1最终字符串line1=null; @SerializedNameline-2最终字符串line2=null; @SerializedNameline-3最终字符串line3=null; @SerializedNamelocality最终字符串位置=null; @SerializedNameregion最终字符串区域=null; @SerializedNamepost代码最终字符串postCode=null; @SerializedNamecountry最终字符串country=null; @SerializedNamelatitude最终字符串latitude=null; @SerializedName经度最终字符串经度=null; 私人地址{ } @凌驾 公共字符串toString{ 返回国家/地区; } } 静态最终类雇主 扩展元素{ @SerializedNametitle最终字符串title=null; @SerializedNameFirstName最终字符串firstName=null; @SerializedNamelast name最终字符串lastName=null; 私人雇主{ } @凌驾 公共字符串toString{ 返回title+''+firstName+''+lastName; } } 静态最终类位置 扩展元素{ @SerializedNameAddressID最终字符串addressId=null; @SerializedNameemployer id最终字符串employerId=null; 私人职位{ } @凌驾 公共字符串toString{ return+addressId+';'+employerId+; } } } 你所要做的只是: 确定预期的对象类型; 如果JSON树符合您的需要,请对齐它; 只需通过反序列化上下文将反序列化工作委托给Gson您的示例做得不好:您再次实例化Gson,丢失了原始配置;您重新执行了Gson可以做的所有开箱即用的事情:通过反射列表和POJO;如果通过开关检查枚举是单例的,那么JsonToken会更好y legal使用参考等式对其进行比较 等。 因此,它可以通过以下方式实现: 最终类ElementJsonDeserializer 实现JsonDeserializer{ 私有静态最终JsonDeserializer elementJsonDeserializer=new elementJsonDeserializer; 私有元素JSONDESerializer{ } 静态JsonDeserializer getElementJsonDeserializer{ 返回元素JSONDESerializer; } @凌驾 公共元素反序列化final JsonElement JsonElement,final类型,final JsonDeserializationContext上下文 抛出JsonParseException{ 最终JsonObject JsonObject=jsonElement.getAsJsonObject; 最终字符串typeCode=jsonObject.getAsJsonPrimitivetype.getAsString;
final Class为什么需要自定义适配器?如果您的模型与json匹配,通常不需要。@nasch,因为如果查看include对象,类型会动态更改,服务器返回的是其中的其他嵌套对象,如JSONAPI格式的关系标记,我会有很多难以维护的模型类ntain,因此最好在自定义模型中映射它们。如果可能的话,也是为了学习目的。非常感谢!也感谢您发送的其他链接中的信息。我会尝试一下并让您知道。很抱歉反应太晚。很有效!!…非常感谢您的帮助和信息。学到了一些新的东西!