Пользовательский логический десериализатор не работает в Gson - PullRequest
0 голосов
/ 16 мая 2018

Я должен десериализовать 0 до false и 1 до true.

Я создал этот класс:

class IntBooleanDeserializer : JsonDeserializer<Boolean?> {
    override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): Boolean? {
        json?.let {
            return json.asInt == 1
        }

        return null
    }
}

И зарегистрировал это:

private val gson = GsonBuilder()
            .registerTypeAdapter(Boolean::class.java, IntBooleanDeserializer())
            .create()

И создал для этого тестовый класс:

data class BooleanClass(val value: Boolean?)

А потом:

gson.fromJson("{\"value\": 0}", BooleanClass::class.java)

Этот код вызывает исключение:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a boolean but was NUMBER at line 1 column 12 path $.value

Похоже, что Gson не использует мой десериализатор для Boolean?, но успешно использует другие пользовательские десериализаторы для других типов (например, для перечислений).

Почему?

1 Ответ

0 голосов
/ 16 мая 2018

Вы регистрируете десериализатор для Boolean::class.java, то есть boolean, в то время как тип, который вам требуется, на самом деле Boolean?, переводя на java.lang.Boolean.

Чтобы получить java.lang.Boolean, вы должны использовать Boolean::class.javaObjectType для регистрации.

Вы также найдете такое же поведение для всех примитивных Java типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...