Используйте Gson для десериализации класса данных с Kotlin «Хранение свойств на карте» - PullRequest
0 голосов
/ 11 июля 2019

Исключение в потоке "основной"


fun main() {
    val user = UserModel(hashMapOf("profession" to "abc", "age" to 10))
    println("user: $user")
    println("userInfo: " + user.userInfo)
    println(user.age)

    println("User from Json")

    val resp = "{\"userInfo\":{\"age\":10, \"profession\":\"abc\"}}"
    val userFromJson = Gson().fromJson(resp, UserModel::class.java)
    println("user: $userFromJson")
    println("userInfo: ${userFromJson.userInfo}")
    println(userFromJson.age)
}

data class UserModel(val userInfo: HashMap<String, Any?>) : Serializable {

    private operator fun <V> MutableMap<in String, in V?>.getValue(thisRef: Any?, property: KProperty<*>): V? {
        println("get ${property.name}")
        @Suppress("UNCHECKED_CAST")
        return getOrDefault(property.name, null) as V?
    }

    private operator fun <V> MutableMap<in String, in V?>?.setValue(ref: Any?, property: KProperty<*>, value: V?) {
        println("set ${property.name} $value")
        this?.put(property.name, value)
    }

    var profession: String? by userInfo
    var age: Int? by userInfo
}

Журнал:

user: UserModel(userInfo={profession=abc, age=10})
userInfo: {profession=abc, age=10}
get age
10
User from Json
user: UserModel(userInfo={profession=abc, age=10.0})
userInfo: {profession=abc, age=10.0}
Exception in thread "main" java.lang.IllegalArgumentException: Parameter specified as non-null is null: method UserModel.getValue, parameter receiver$0
    at UserModel.getValue(DelegateTest.kt)
    at UserModel.getAge(DelegateTest.kt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...