Как использовать альтернативное поле @SerializedName в GSON для десериализации вложенного объекта? - PullRequest
0 голосов
/ 21 сентября 2018

В десериализации я пытаюсь отобразить различные узлы JSON в одно поле с помощью GSON.

У меня есть следующее поле в классе:

private List<MyObjects> pages;

Входящий JSON может быть:

{
  "pages": [
    {
      "pageNumber": "1"
    }
  ]
}

Или

{
  "pages": {
    "list": [
      {
        "pageNumber": "1"
      }
    ]
  }
}

Я пытаюсь сопоставить массив страниц с полем класса pages , используя это:

@SerializedName(value = "pages", alternate = "pages.list")
public List<MyObjects> pages;

но это не работает.

Кажется, что GSON не поддерживает это.Но может кто знает почему?

1 Ответ

0 голосов
/ 21 сентября 2018

На вопрос

Как использовать альтернативное поле в GSON?

ответ лежит в документах, которые я частично скопировал здесь (и, возможно, вы уже знаете всеили часть этого).

По вопросу

Кажется, GSON не поддерживает это.Но, может быть, кто-то знает, почему?

Да, может, какой-нибудь дизайнер Gson мог бы ответить на это.Лично я не вижу причин, по которым он не может поддерживать JSONPath в этом атрибуте аннотации.В любом случае, я сконцентрируюсь на вопросе в заголовке.

Это просто не то, как @SerializedName.alternate работает сейчас.Если вы посмотрите на спецификации Gson API :

public abstract String [] alternate

Возвращает: альтернативные имена поля, когда оно десериализовано

(поэтому имена не пути)

Вот пример использования этой аннотации:

public class MyClass {
    @SerializedName("name") String a;
    @SerializedName(value="name1", alternate={"name2", "name3"}) String b;

и

При десериализации все значения, указанные в аннотации, будут десериализованы в поле.Например:

MyClass target = gson.fromJson("{'name1':'v1'}", MyClass.class);
assertEquals("v1", target.b);
target = gson.fromJson("{'name2':'v2'}", MyClass.class);
assertEquals("v2", target.b);
target = gson.fromJson("{'name3':'v3'}", MyClass.class);
assertEquals("v3", target.b);

Другими словами - при десериализации - он просто отображает поля с разными именами для десериализации в одно и то же поле.Он не отображает поля в альтернативных путях в Json источнике.Впрочем, это может быть хорошей функцией.

Так что в примере документа API все поля с именем ["name1", "name2", "name3"] будут десериализованы в MyClass field b,Чего он не делает - как я понял, - это десериализует любой вложенный объект Json в это аннотированное поле.

В настоящий момент эти два pages поля кажутся Gson разными объектами.

...