我将来自服务器的传入json存储到我的模型类中。我试图创建通用化响应类,以将不同Web服务的响应存储在领域db中。
这是我的回复课程
public class TResponse<T> {
@Expose
private String code;
@Expose
private String message;
@Expose
private Summary summary;
@Expose
private String status;
@Expose
private String error;
@Expose
private List errors;
@Expose
private List<T> response;
}
我要存储的杰森
{
"diabetes": [
{
"_id": "5b83a79e4297c60021cc0ee2",
"blood_glucose": 137,
"timestamp": "2018-07-31T09:01:48+00:00",
"utc_offset": "+05:30",
"last_updated": "2018-08-27T07:26:22+00:00"
},
{
"_id": "5b83a79e4297c60021cc0e88",
"blood_glucose": 140,
"timestamp": "2018-07-31T09:01:48+00:00",
"utc_offset": "+05:30",
"last_updated": "2018-08-27T07:26:22+00:00"
}
],
"errors": [
{
"code": 409,
"message": "Conflict",
"errors": "Activity is already taken",
"activity_id": "468eb4bf-0d84-4b77-bb94-daebd0063955"
}
]
}
糖尿病阵列将要存储到广义列表List<T> response
中,现在为了将糖尿病映射到List<T> response
,我必须在解串器中显式映射该列表,为此我正在使用{{ 1}}解析器
Gson
上面的代码mKey中的 @Override
public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
TResponse tResponse = new TResponse();
tResponse.setSummary(context.deserialize(json.getAsJsonObject().get("summary"),Summary.class));
tResponse.setResponse(context.deserialize(json.getAsJsonObject().get(mKey.toLowerCase()),List.class));
tResponse.setErrors(context.deserialize(json.getAsJsonObject().get("errors").getAsJsonArray(),List.class));
return (T) tResponse;
}
现在的问题是,当尝试创建Diabetes.class
的新对象并将数据存储到其中时,Gson将其存储为TResponse
而不是LinkedTreeMap
请参见下面的屏幕截图
答案 0 :(得分:0)
所有我需要照顾的参数化类类型,这里我只是传递原始类信息,因此解析器无法弄清楚列表下面的内容
tResponse.setResponse(context.deserialize(json.getAsJsonObject().get(mKey.toLowerCase()),getType(List.class,Diabetes.class)));
以下是负责参数类并返回适当的Type
private Type getType(final Class<?> rawClass, final Class<?> parameterClass) {
return new ParameterizedType() {
@Override
public Type[] getActualTypeArguments() {
return new Type[]{parameterClass};
}
@Override
public Type getRawType() {
return rawClass;
}
@Override
public Type getOwnerType() {
return null;
}
};
}