Gson десериализует текущий объект с расширенным классом - PullRequest
0 голосов
/ 23 мая 2018

Я новичок в Java (Хм ... Нет ... Я изучал Java в школе 10 лет назад, но с тех пор никогда не использовал его).

У меня есть объектный класс, который соответствует моемуjson и был создан на веб-сайте http://www.jsonschema2pojo.org/ (здесь упрощенно):

public class ServerDatasObject {
  private Integer error;
  private Boolean isOffline;
  public Integer getError() {
      return error;
  }
  public Boolean getIsOffline() {
      return isOffline;
  }
}

И еще один класс используется для доступа ко всем данным объекта (также упрощенно):

public class ServerDatasHandler extends ServerDatasObject {
  public ServerDatasHandler(String json) {
    Gson gson = new Gson();
    // how to populate current object using : gson.fromJson(json, ServerDatasObject.class);
  }
}

Вопрос в коде: как заполнить текущий объект?Я искал и нашел кое-что о InstanceCreator:

final Foo existing;
InstanceCreator<Foo> creator = new InstanceCreator<Foo>() {
  public Foo createInstance(Type type) { return existing; }
}

Gson gson = new GsonBuilder().registerTypeAdapter(Foo.class, creator).create();
Foo value = gson.fromJson(jsonString, Foo.class);
// value should be same as existing

, но я не понимаю, как его использовать и если это то, что мне нужно.

конечная цель -

{
  ServerDatasHandler serverDatasHandler = new ServerDatasHandler (json);
  do something with serverDatasHandler.getError()
}

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 23 мая 2018

Вы можете создать отдельный статический метод, который создает ваш обработчик из json:

public static ServerDatasHandler fromJsonConfig(String json) {
  Gson gson = new Gson();
  ServerDatasHandler handler = gson.fromJson(json, ServerDatasHandler.class);
  return handler;
}

Конечно, вы также можете переместить этот метод на фабрику.

Я никогда не использовал InstanceCreatorвнутри конструктора, потому что разбор JSON почти никогда не является задачей для конструктора.Желательно, чтобы он был спрятан внутри каркаса или ваших собственных фабрик.Однако ваш пример с InstanceCreator также должен работать, если вы вернете ServerDatasHandler.this из метода createInstance.

...