Retrofit android: gson数组内容反序列化
Retrofit android: gson array content deserialization
我正在 API Android 上使用 Retrofit(1.9.0) 和 gson 库(1.7.0 我与 gson 2.3.1 版有兼容性问题)的请求,我向 API 发出一些请求,它在 url 调用后具有相同的响应格式但内容不同,但我遇到了一个反序列化内部数组的答案的问题。这是我要反序列化的 json 的示例:
{
"http_code":200,
"content":[
{
"name":"Groult Christian",
"location":[
48.897655,
2.252462
],
"website":null,
"address":{
"street_address":"XXXXXX",
"city":"XXXXXX",
"state":null,
"postal_code":"XXXXXX",
"country":"XXXXXX"
},
"global_score":0,
"popularity_score":0,
"quality_score":0,
"createdAt":"2015-02-18T02:13:05.068Z",
"updatedAt":"2015-02-18T02:13:05.068Z",
"id":"54e3f531775288ca572872ac"
},
...
]
}
我的 DeserializerJson 以及我如何调用它进行改造:
public class DeserializerJson<T> implements JsonDeserializer<T> {
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException
{
// Get the "content" element from the parsed JSON
JsonElement content = je.getAsJsonObject().get("content");
// Deserialize it. You use a new instance of Gson to avoid infinite recursion
// to this deserializer
return new Gson().fromJson(content, type);
}
}
...
Gson gson = new GsonBuilder()
.registerTypeAdapter(ContentUser.class, new DeserializerJson<ContentUser>())
.registerTypeAdapter(DeviceInfo.class, new DeserializerJson<DeviceInfo>())
.registerTypeAdapter(PlacesModel.class, new DeserializerJson<PlacesModel>())
.create();
RestAdapter restAdapter = new RestAdapter.Builder()
.setLogLevel(RestAdapter.LogLevel.BASIC)
.setConverter(new GsonConverter(gson))
...
...
和我的不同型号:
public class PlacesModel {
@SerializedName("name")
@Expose
private String name;
@SerializedName("location")
@Expose
private List<Double> location = new ArrayList<Double>();
@SerializedName("website")
@Expose
private Object website;
@SerializedName("address")
@Expose
private AddressModel address;
@SerializedName("global_score")
@Expose
private Integer globalScore;
@SerializedName("popularity_score")
@Expose
private Integer popularityScore;
@SerializedName("quality_score")
@Expose
private Integer qualityScore;
@SerializedName("createdAt")
@Expose
private String createdAt;
@SerializedName("updatedAt")
@Expose
private String updatedAt;
@Expose
@SerializedName("id")
private String id;
/* Getters and Setters... */
}
public class AddressModel {
@SerializedName("street_address")
@Expose
private String streetAddress;
@SerializedName("city")
@Expose
private String city;
@SerializedName("state")
@Expose
private Object state;
@SerializedName("postal_code")
private String postalCode;
@SerializedName("country")
@Expose
private String country;
/* Getters and Setters... */
}
url呼叫Api经理是这样的:
@GET("/places")
public void getPlaces(RestCallback<List<PlacesModel>> callback);
但是当我调用时出现此错误:com.google.gson.JsonParseException: The JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@3b8aa06 failed to deserialize json object
其他调用一切正常,我得到了所有内容,所以没有问题,但内容中有数组的地方我收到错误,我不明白为什么我相信如果我只是列出我的模型它会很好,但它不起作用。
我想我错过了一些东西所以如果有人可以帮助我
提前致谢
您的问题是您为 PlacesModel
class 注册了 DeserializerJson
,并且在 getPlaces 方法中您的响应是 List<PlacesModel>
class。 List<PlacesModel>
与 PlacesModel
不同 class,因此 Gson 不知道如何反序列化 List<PlacesModel>
。你要做的就是通过这个方法再注册一个Deserialiser:
.registerTypeAdapter(List.class, new DeserializerJson<List<PlacesModel>>())
如果你使用不止一种类型的List
(我的意思是List<PlacesModel>
和List< DeviceInfo >
)你可以定义你自己的TypeAdapter
或者你cN改变列表到数组并为它们注册解串器,如下所示
.registerTypeAdapter(PlacesModel[].class, new DeserializerJson<PlacesModel[]>())
现在您的 json.
一切正常
我正在 API Android 上使用 Retrofit(1.9.0) 和 gson 库(1.7.0 我与 gson 2.3.1 版有兼容性问题)的请求,我向 API 发出一些请求,它在 url 调用后具有相同的响应格式但内容不同,但我遇到了一个反序列化内部数组的答案的问题。这是我要反序列化的 json 的示例:
{
"http_code":200,
"content":[
{
"name":"Groult Christian",
"location":[
48.897655,
2.252462
],
"website":null,
"address":{
"street_address":"XXXXXX",
"city":"XXXXXX",
"state":null,
"postal_code":"XXXXXX",
"country":"XXXXXX"
},
"global_score":0,
"popularity_score":0,
"quality_score":0,
"createdAt":"2015-02-18T02:13:05.068Z",
"updatedAt":"2015-02-18T02:13:05.068Z",
"id":"54e3f531775288ca572872ac"
},
...
]
}
我的 DeserializerJson 以及我如何调用它进行改造:
public class DeserializerJson<T> implements JsonDeserializer<T> {
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException
{
// Get the "content" element from the parsed JSON
JsonElement content = je.getAsJsonObject().get("content");
// Deserialize it. You use a new instance of Gson to avoid infinite recursion
// to this deserializer
return new Gson().fromJson(content, type);
}
}
...
Gson gson = new GsonBuilder()
.registerTypeAdapter(ContentUser.class, new DeserializerJson<ContentUser>())
.registerTypeAdapter(DeviceInfo.class, new DeserializerJson<DeviceInfo>())
.registerTypeAdapter(PlacesModel.class, new DeserializerJson<PlacesModel>())
.create();
RestAdapter restAdapter = new RestAdapter.Builder()
.setLogLevel(RestAdapter.LogLevel.BASIC)
.setConverter(new GsonConverter(gson))
...
...
和我的不同型号:
public class PlacesModel {
@SerializedName("name")
@Expose
private String name;
@SerializedName("location")
@Expose
private List<Double> location = new ArrayList<Double>();
@SerializedName("website")
@Expose
private Object website;
@SerializedName("address")
@Expose
private AddressModel address;
@SerializedName("global_score")
@Expose
private Integer globalScore;
@SerializedName("popularity_score")
@Expose
private Integer popularityScore;
@SerializedName("quality_score")
@Expose
private Integer qualityScore;
@SerializedName("createdAt")
@Expose
private String createdAt;
@SerializedName("updatedAt")
@Expose
private String updatedAt;
@Expose
@SerializedName("id")
private String id;
/* Getters and Setters... */
}
public class AddressModel {
@SerializedName("street_address")
@Expose
private String streetAddress;
@SerializedName("city")
@Expose
private String city;
@SerializedName("state")
@Expose
private Object state;
@SerializedName("postal_code")
private String postalCode;
@SerializedName("country")
@Expose
private String country;
/* Getters and Setters... */
}
url呼叫Api经理是这样的:
@GET("/places")
public void getPlaces(RestCallback<List<PlacesModel>> callback);
但是当我调用时出现此错误:com.google.gson.JsonParseException: The JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@3b8aa06 failed to deserialize json object
其他调用一切正常,我得到了所有内容,所以没有问题,但内容中有数组的地方我收到错误,我不明白为什么我相信如果我只是列出我的模型它会很好,但它不起作用。 我想我错过了一些东西所以如果有人可以帮助我
提前致谢
您的问题是您为 PlacesModel
class 注册了 DeserializerJson
,并且在 getPlaces 方法中您的响应是 List<PlacesModel>
class。 List<PlacesModel>
与 PlacesModel
不同 class,因此 Gson 不知道如何反序列化 List<PlacesModel>
。你要做的就是通过这个方法再注册一个Deserialiser:
.registerTypeAdapter(List.class, new DeserializerJson<List<PlacesModel>>())
如果你使用不止一种类型的List
(我的意思是List<PlacesModel>
和List< DeviceInfo >
)你可以定义你自己的TypeAdapter
或者你cN改变列表到数组并为它们注册解串器,如下所示
.registerTypeAdapter(PlacesModel[].class, new DeserializerJson<PlacesModel[]>())
现在您的 json.
一切正常