使用Gson反序列化数据时将LinkedTreeMap转换为List

时间:2018-08-27 08:36:50

标签: android realm gson

我将来自服务器的传入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

请参见下面的屏幕截图

enter image description here

1 个答案:

答案 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;
            }

        };
    }