Как Moshi применяет значение kotlin по умолчанию к пустому полю json

Джейсон

{
    "id": "1",
    "name": "name",
    "email": null
}

Пользователь

data class User(
    var id: Int = 0,
    var name: String = "",
    var email: String = ""
)

Я хочу применить значение по умолчанию для нулевого значения при разборе json. (Примените указанное выше поле электронной почты как ненулевое «» (пустое))


person dylan.kwon    schedule 08.04.2019    source источник
comment
Посмотрите это   -  person Hemant Parmar    schedule 08.04.2019


Ответы (2)


Подробности: https://code.luasoftware.com/tutorials/android/android-moshi-adapter-convert-null-to-empty-string/

TL;DR;

Создайте NullToEmptyStringAdapter.

@Retention(AnnotationRetention.RUNTIME)
@JsonQualifier
annotation class NullToEmptyString

class NullToEmptyStringAdapter {
    @ToJson
    fun toJson(@NullToEmptyString value: String?): String? {
        return value
    }

    @FromJson
    @NullToEmptyString
    fun fromJson(@javax.annotation.Nullable data: String?): String? {
        return data ?: ""
    }
}

Примените NullToEmptyStringAdapter к вашему классу данных.

data class User(
    var id: Int = 0,
    var name: String = "",
    @NullToEmptyString
    var email: String = ""
)

Настройка Моши

val moshi = Moshi.Builder()
    .add(NullToEmptyStringAdapter())
    .add(KotlinJsonAdapterFactory())
    .build()
person Stanley Ko    schedule 08.04.2019

Я нашел этот вопрос, когда искал решение этого вопроса, но я не хочу использовать адаптер, потому что по умолчанию вы можете использовать только одно значение и один тип. Для меня это не гибко.

Вместо добавления адаптера я использую геттер и сеттер в Котлине.

data class User(
    @Json(name = "id") var _id: Int?,
    @Json(name = "name") var _name: String?,
    @Json(name = "email") var _email: String?
) {
    var id: Int
        get() = _id ?: 0
        set(value) {
            _id = value
        }

    var name: String
        get() = _name ?: ""
        set(value) {
            _name = value
        }

    var email: String
        get() = _email ?: ""
        set(value) {
            _email = value
        }
}

Используя этот метод, вы можете задать разные значения по умолчанию, если хотите.

person Joshua    schedule 24.01.2020
comment
Смерть этим адаптерам дама +1 - person Mocha; 11.12.2020