GSON не может десериализовать класс Kotlin с пользовательским геттером

Хорошо, у меня есть класс

class Address { var address1: String? = null } 

И простой json

 String jsonString = "{\"address1\":\"test\"}"; 

Так что все, что я хочу, десериализировать, поэтому я просто пишу

  Gson gson = new GsonBuilder().create(); Address address = gson.fromJson(jsonString, Address.class); 

И он отлично работает.

Но если добавить пользовательский getter

 class Address { var address1: String? = null get() = address1 ?: "" } 

Я получаю

 java.lang.StackOverflowError at ru.reksoft.okey.models.Address.getAddress1(Address.kt:8) at ru.reksoft.okey.models.Address.getAddress1(Address.kt:8) //and here are a lot of same lines 

Так что я могу сделать, чтобы он работал правильно?

Единственное решение, которое я вижу, – это удаление пользовательских геттеров вообще, но что, если они мне действительно нужны?

Вместо этого вы должны работать с field :

 class Address { var address1: String? = null get() = field ?: "" } 

Проблема состоит в том, что использование address1 внутри своего собственного сеттера приводит к рекурсивной последовательности вызовов. Вместо этого field квалификатор относится к полю резервного копирования. Рекурсивная последовательность приводит к столкновению StackOverflowError .

Но на самом деле, вы также должны думать о смысле вашей собственности: он объявлен как NULL String , но вы не допускаете null так как вы сопоставляете его с пустой String . Действительно ли "" принят» для адреса? Было бы намного проще просто сделать val address1: String = "" .

Вы пытаетесь получить доступ к свойству в методе getter. Это, в свою очередь, вызовет его метод getter и т. Д. … Это означает, что он вызывает рекурсивно до исключения.

использовать оператор field для доступа к его значению

 var address1: String? = null get() = field ?: "" 

РЕДАКТИРОВАТЬ

Зачем допускать недействительность, если это не имеет никакого смысла? Пусть Котлин позаботится об этом. Просто делать

 var address1: String = "" 
Intereting Posts
Объединение Java с Kotlin в Android Копирование документов KDoc с одного метода на другой Запустите Kotlin REPL из контекста моего проекта Maven? Не удалось найти класс databinding.FragmentBinding Kotlin весело возвращается преждевременно Kotlin: получить расширение файла со стандартной функциональностью Regex – слова соответствия, которые не являются строками Kotlin: закрытый класс не может «содержать» классы данных? Зачем? Невозможно запустить сканирование покрытия (Java / Kotlin / Gradle 3.3 на Windows и Travis) Функцию можно написать в Котлине (т.е. на верхнем уровне). Могу ли я также тестировать те, кто находится на верхнем уровне? проект kotlin не может быть построен в градле Tornadofx Javafx – Как перезагрузить представление / компонент Установите маркер времени выполнения для любого вида с помощью Kotlin Котлин || Не удалось добавить библиотеку в Мое приложение? Компилятор Kotlin жалуется на использование выражения SPeL в определении свойства. ЗАЧЕМ?