GSON不能用自定义getter来反序列化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
那么我能做些什么才能使它正常工作?
我看到的一个解决方案是根本不需要定制getters,但是如果我真的需要它们呢?
你应该使用该field
:
class Address { var address1: String? = null get() = field ?: "" }
问题是,在自己的setter中使用address1
导致递归调用序列。 相反, field
限定符指的是后台字段。 递归序列导致您遇到的StackOverflowError
。
但是实际上,你也应该考虑一下你的属性:它被声明为一个可以为空的String
,但是你不允许null
因为你把它映射到一个空的String
。 ""
真的接受的地址? 简单地做val address1: String = ""
。
您正尝试通过其getter方法访问属性。 这又将调用其getter方法等等…这意味着它正在递归调用自己,直到异常。
使用field
操作员来访问其值
var address1: String? = null get() = field ?: ""
编辑
为什么允许可空性,如果它没有任何意义? 让Kotlin照顾这个问题。 做就是了
var address1: String = ""