преобразовать LinkedTreeMap в список при десериализации данных с помощью Gson - PullRequest
0 голосов
/ 27 августа 2018

Я сохраняю входящий JSON с сервера в моем классе модели.я пытался создать обобщенный класс ответа для хранения ответа различных веб-сервисов в области базы данных.

Вот мой класс ответа

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;

}

Json, который я пытаюсьstore

{
  "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, я должен отобразить этот список явно в десериализаторе и для этого яиспользуя Gson parser

 @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;

    }

в приведенном выше коде, mKey является Diabetes.class

Теперь проблема заключается в том, когда я пытаюсь создать новый объект TResponse и сохранить в нем данныеGson сохраняет его как LinkedTreeMap, а не List

, см. Скриншот ниже

enter image description here

1 Ответ

0 голосов
/ 27 августа 2018

Все, что мне нужно, чтобы позаботиться о параметризованном типе класса, и здесь я просто передавал необработанную информацию о классе, следовательно, парсер не смог выяснить, что находится под списком

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

        };
    }
...