Moshi如何将kotlin的默认值应用到json的null字段
How Moshi applies the default value of kotlin to the null field of json
Json
{
"id": "1",
"name": "name",
"email": null
}
用户
data class User(
var id: Int = 0,
var name: String = "",
var email: String = ""
)
我想在解析 json 时为空值应用默认值。
(将上述电子邮件字段应用为非空“”(空白))
详情:
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 应用于您的数据 class。
data class User(
var id: Int = 0,
var name: String = "",
@NullToEmptyString
var email: String = ""
)
设置 Moshi
val moshi = Moshi.Builder()
.add(NullToEmptyStringAdapter())
.add(KotlinJsonAdapterFactory())
.build()
我在寻找这个问题的解决方案时发现了这个问题,但我不想使用适配器,因为你只能默认一个值和一种类型。它对我来说不灵活。
我没有添加适配器,而是在 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
}
}
使用此方法,您可以根据需要提供不同的默认值。
Json
{
"id": "1",
"name": "name",
"email": null
}
用户
data class User(
var id: Int = 0,
var name: String = "",
var email: String = ""
)
我想在解析 json 时为空值应用默认值。 (将上述电子邮件字段应用为非空“”(空白))
详情: 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 应用于您的数据 class。
data class User(
var id: Int = 0,
var name: String = "",
@NullToEmptyString
var email: String = ""
)
设置 Moshi
val moshi = Moshi.Builder()
.add(NullToEmptyStringAdapter())
.add(KotlinJsonAdapterFactory())
.build()
我在寻找这个问题的解决方案时发现了这个问题,但我不想使用适配器,因为你只能默认一个值和一种类型。它对我来说不灵活。
我没有添加适配器,而是在 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
}
}
使用此方法,您可以根据需要提供不同的默认值。