当服务器在 moshi 中为该值发送 null 时,kotlin 数据中的默认值 class 不起作用
default value in kotlin data class not work when server send null for that value in moshi
我使用 Moshi 从服务器解析 json。如果服务器为未设置项目默认值发送 null!但服务器不发送该项目的默认值集。
json:
{"percentChange": null,"change": "-2500.00","value": "130000","name": null}
数据class:
@JsonClass(generateAdapter = true) data class Reference(val name:String? = "-",val value: Double,val change: Double,val percentChange: Double? = -10.0,)
但 name 和 percentChange 的数据为空,名称应为“-”,percentChange 应为“-10.0”。如果服务器不发送 name 和 percentChange,默认值有效,但如果发送 null 默认值无效!
我使用 converter-moshi:2.4.0 和 retrofit:2.4.0
这是按预期工作的,因为在 JSON 中作为键值的 null 文字在语义上不同于键和值的缺失。
您可以为您的用例制作自定义 JsonAdapter。
@JsonClass(generateAdapter = true)
data class Reference(
@Name val name: String = "-",
val value: Double,
val change: Double,
val percentChange: Double? = -10.0
) {
@Retention(RUNTIME)
@JsonQualifier
annotation class Name
companion object {
@Name @FromJson fun fromJson(reader: JsonReader, delegate: JsonAdapter<String>): String {
if (reader.peek() == JsonReader.Token.NULL) {
reader.nextNull<Unit>()
return "-"
}
return delegate.fromJson(reader)!!
}
@ToJson fun toJson(@Name name: String): String {
return name
}
}
}
@Test fun reference() {
val moshi = Moshi.Builder()
.add(Reference)
.build()
val adapter = moshi.adapter(Reference::class.java)
val decoded = Reference("-", 130_000.toDouble(), (-2_500).toDouble(), null)
assertThat(adapter.fromJson(
"""{"percentChange": null,"change": "-2500.00","value": "130000"}"""))
.isEqualTo(decoded)
assertThat(adapter.fromJson(
"""{"percentChange": null,"change": "-2500.00","value": "130000","name": null}"""))
.isEqualTo(decoded)
}
我使用 Moshi 从服务器解析 json。如果服务器为未设置项目默认值发送 null!但服务器不发送该项目的默认值集。
json:
{"percentChange": null,"change": "-2500.00","value": "130000","name": null}
数据class:
@JsonClass(generateAdapter = true) data class Reference(val name:String? = "-",val value: Double,val change: Double,val percentChange: Double? = -10.0,)
但 name 和 percentChange 的数据为空,名称应为“-”,percentChange 应为“-10.0”。如果服务器不发送 name 和 percentChange,默认值有效,但如果发送 null 默认值无效!
我使用 converter-moshi:2.4.0 和 retrofit:2.4.0
这是按预期工作的,因为在 JSON 中作为键值的 null 文字在语义上不同于键和值的缺失。
您可以为您的用例制作自定义 JsonAdapter。
@JsonClass(generateAdapter = true)
data class Reference(
@Name val name: String = "-",
val value: Double,
val change: Double,
val percentChange: Double? = -10.0
) {
@Retention(RUNTIME)
@JsonQualifier
annotation class Name
companion object {
@Name @FromJson fun fromJson(reader: JsonReader, delegate: JsonAdapter<String>): String {
if (reader.peek() == JsonReader.Token.NULL) {
reader.nextNull<Unit>()
return "-"
}
return delegate.fromJson(reader)!!
}
@ToJson fun toJson(@Name name: String): String {
return name
}
}
}
@Test fun reference() {
val moshi = Moshi.Builder()
.add(Reference)
.build()
val adapter = moshi.adapter(Reference::class.java)
val decoded = Reference("-", 130_000.toDouble(), (-2_500).toDouble(), null)
assertThat(adapter.fromJson(
"""{"percentChange": null,"change": "-2500.00","value": "130000"}"""))
.isEqualTo(decoded)
assertThat(adapter.fromJson(
"""{"percentChange": null,"change": "-2500.00","value": "130000","name": null}"""))
.isEqualTo(decoded)
}