GSON no puede deserializar la class Kotlin con getter personalizado

Bueno, tengo una class

class Address { var address1: String? = null } 

Y simple json

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

Entonces, todo lo que quiero deserializar es que solo escribo

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

Y funciona perfectamente.

Pero si agrego getter personalizado

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

Me estoy poniendo

 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 

Entonces, ¿qué puedo hacer para que funcione correctamente?

La única solución que veo es eliminar getters personalizados en absoluto, pero ¿y si realmente los necesito?

Deberías trabajar con el field lugar:

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

El problema es que usar address1 dentro de su propio setter conduce a una secuencia de llamadas recursiva. En cambio, el calificador de field se refiere al campo de respaldo . La secuencia recursiva lleva al StackOverflowError que encontraste.

Pero, en realidad, también debe pensar sobre el sentido de su propiedad: se declara como una String null , pero no permite null ya que se asigna a una String vacía. ¿Es "" realmente aceptado para la dirección? Sería mucho mejor simplemente hacer val address1: String = "" .

Está intentando acceder a una propiedad en su método getter. Que a su vez llamará a su método getter y así sucesivamente … Lo que significa que se está llamando recursivamente hasta la exception.

use el operador de field para acceder a su valor

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

EDITAR

¿Por qué permitir la nulabilidad si no tiene ningún sentido? Deje que Kotlin se encargue del problema. Solo haz

 var address1: String = "" 
  • ¿Es posible aplicar una sola anotación a múltiples objectives de sitio de uso en Kotlin?
  • ¿Cómo podría probar que un método no está siendo invocado para un object no simulado?
  • ¿Cómo manejar la class duplicada antes de la compilation kotlin-android?
  • Recepción de parameters de formulario en el server de Ktor
  • ¿Cuál es la syntax para Class <? extiende class_name> en kotlin?
  • No se pueden reutilizar los parameters de la function
  • 'x' no es una function al pasar parameters en Kotlin Javascript
  • retroajuste + desnerializador gson: retorno dentro de la matriz
  • Inicializando matrices en kotlin
  • msg: ¿No se puede encontrar el getter para el atributo 'android: text' con el tipo de valor java.lang.String en el data binding?
  • Kotlin: ambigüedad de resolución de sobrecarga lambda y sobrecarga