GSON不能使用自定义getter对Kotlin类进行反序列化

时间:2017-10-24 08:53:07

标签: android 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

那么我该怎么做才能让它正常工作?

我看到的一个解决方案是删除自定义getter,但如果我真的需要它们呢?

2 个答案:

答案 0 :(得分:3)

您应该使用field代替:

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

问题是,在自己的setter中使用address1会导致递归调用序列。相反,field限定符引用backing字段。递归序列会导致您遇到StackOverflowError

但实际上,您还应该考虑一下您的财产感:它被声明为可以为String,但是您不允许null,因为您将其映射到空String。这个地址真的被""接受了吗?简单地做val address1: String = ""会好得多。

答案 1 :(得分:2)

您正尝试在其getter方法中访问属性。哪个将反过来调用它的getter方法等等......这意味着它会递归调用自己直到异常。

使用field运算符访问其值

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

修改

为什么在没有任何意义的情况下允许可空性? 让Kotlin处理这个问题。只是做

var address1: String = ""