8

Json

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

User

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

I want to apply default value for null value when parsing json. (Apply the above email field as a non-null ""(blank))

dylan.kwon
  • 435
  • 5
  • 14

2 Answers2

9

Details: https://code.luasoftware.com/tutorials/android/android-moshi-adapter-convert-null-to-empty-string/

TL;DR;

Create 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 ?: ""
    }
}

Apply NullToEmptyStringAdapter to your data class.

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

Setup Moshi

val moshi = Moshi.Builder()
    .add(NullToEmptyStringAdapter())
    .add(KotlinJsonAdapterFactory())
    .build()
Stanley Ko
  • 3,383
  • 3
  • 34
  • 60
4

I found this question when I was finding a solution to this question but I do not want to use an adapter because you can only default to one value and one type. It is not flexible for me.

Instead of add an adapter, I use getter and setter in Kotlin.

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

Using this method, you are give different default values if you want.

Joshua
  • 5,901
  • 2
  • 32
  • 52
  • 5
    Death to these dahm adapters +1 – Mocha Dec 11 '20 at 01:14
  • This one gives me `Caused by: java.lang.IllegalArgumentException: duplicate option: [text=name"]` so I just initialize `name` like so `val name: String = _name ?: ""` Still this is way better than stupid adapters. – Nikita Kalugin Aug 17 '21 at 11:19