Moshi如何将kotlin的默认值应用于json的null字段

时间:2019-04-08 05:42:48

标签: android json moshi

Json

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

用户

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

我想在解析json时将默认值应用于null值。 (将上面的电子邮件字段应用为非空的“”(空白))

2 个答案:

答案 0 :(得分: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(@Nullable data: String?): String? {
        return data ?: ""
    }
}

将NullToEmptyStringAdapter应用于数据类。

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

设置Moshi

val moshi = Moshi.Builder()
    .add(NullToEmptyStringAdapter())
    .add(KotlinJsonAdapterFactory())
    .build()

答案 1 :(得分:2)

当我找到该问题的解决方案时发现了这个问题,但是我不想使用适配器,因为您只能默认为一个值和一种类型。对我来说不灵活。

我没有在Kotlin中使用getter和setter来添加适配器。

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
        }
}

使用此方法,可以根据需要提供不同的默认值。