У меня есть класс, который выглядит следующим образомGson: Пользовательские десериализации, если определенное поле присутствует
class Person {
Long id;
String firstName;
int age;
}
и мой вклад либо выглядит следующим образом:
{ "id": null, "firstName": "John", "age": 10 }
или как это:
{ "id": 123 }
Первый вариант представляет собой «новое» (не сохраняющееся) лицо, а второе относится к человеку по его идентификатору базы данных.
Если id
не является нулевым, я хотел бы загрузить объект из базы данных во время десериализации, в противном случае - отменить регулярный синтаксический анализ и десериализовать его как новый объект.
Что я пробовал: Я в настоящее время JsonDeserializer
для базы данных-десериализации, но, как я понимаю, нет никакого способа, чтобы «отступить» на регулярной разборе. Согласно this answer, я должен использовать TypeAdapterFactory
и getDelegateAdapter
. Моя проблема с этим подходом заключается в том, что мне присваивается JsonReader
(а не, например, JsonElement
), поэтому я не могу определить, содержит ли входной код действительный id
без использования входных данных.
Любые предложения по тому, как это решить?
Я пробовал именно это, но я получаю исключение StackOverflowException из-за бесконечной рекурсии. Я думаю, что контекст представляет «этот» gson, а не то, что этот gson был бы без этого адаптера типа. – aioobe
@aioobe: а как насчет создания нового объекта 'Gson' в' JsonDeserializer' и do 'Person person = new Gson(). FromJson (json, Person.class);'? – MikO
Правильно, это сработало бы для простого примера, который я написал в моем вопросе. Однако в моем фактическом коде у меня есть ссылки на другие объекты (предположим, например, что «Лицо» будет иметь ссылку на «Личный родитель»). Если мы делегируем синтаксический анализ человека другому объекту 'gson', родительский элемент * не может быть загружен из базы данных. – aioobe