Общий подход к десериализации Json для объекта - PullRequest
0 голосов
/ 18 мая 2018

Это особый вопрос, и я не смог получить никакой информации по этой теме в javadoc Gson .


В настоящее время я пытаюсь разобратьJson (1) { "foo":"bar", "bar":"foo" } для объекта Entity.Обычно я сопоставлял бы эти значения объекту Entity с полями foo и bar, однако я хотел бы быть более независимым от API.


Для (1) у меня будет

public class Entity {
String foo;
String bar;
}

Но если мы протестируем другую конечную точку, результирующий Json (2) будет выглядеть как

{ "notFoo":"bar", "notBar":"foo" }

, что делает мой предыдущий построенный Entity бесполезным , и мне нужно создать новый класс с соответствующими полями для этого.


Так что мойактуальный вопрос:

  1. Существует ли универсальный (более общий, чем мой пример) подход, чтобы подтолкнуть Json к GenericEntity -> g.fromJson(response.getBody(),GenericEntity.class);, который каждый поле json будет успешно отображено, даже при использовании разных конечных точек?

  2. В качестве альтернативы, есть ли другие зависимости, которые поддерживают это из коробки?

Ответы [ 2 ]

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

У вас нет проблемы десериализации, у вас есть проблема, связанная с незнанием того, как представлять неоднородные данные.

Нет смысла говорить, что это должно быть Object, поскольку это определенно должен быть какой-то тип ниже Object, возможно, больше, чем один.Сначала решите эту проблему: определите все типы, которые вы можете использовать для всех вариантов использования, а затем, скорее всего, вы увидите, как решить проблему десериализации.

Конечно, для любого текста JSON, определенного между {...}, вы всегда можете выбрать Map<String, Object>, где Object - это одно из:

  • далее Map<String, Object>, где Objectследует этим правилам
  • List<Object>, где Object следует этим правилам
  • String
  • одного из атомарных типов или их значений в штучной упаковке

С помощью приведенных выше правил вы можете представлять более или менее все, и вы можете написать Gson десериализаторов для предоставления вам этих типов на основе типа JSON каждого узла (при выполнении итерации через дерево JSON).Однако не совсем понятно, какую пользу вы могли бы извлечь из такой неоднородной нетипизированной структуры данных.

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

Вы можете использовать аннотацию @serializedName, как написано в Несколько GSON @SerializedName на поле? .Но схема должна быть такой же, у вас есть только альтернативы имени ключа.

...