h.k*_*ari 10 android kotlin moshi retrofit2
我使用 Moshi 从服务器解析 json。如果服务器为未设置项目默认值发送 null!但服务器不发送该项目的默认值集。
json:
{"percentChange": null,"change": "-2500.00","value": "130000","name": null}
Run Code Online (Sandbox Code Playgroud)
数据类:
@JsonClass(generateAdapter = true) data class Reference(val name:String? = "-",val value: Double,val change: Double,val percentChange: Double? = -10.0,)
Run Code Online (Sandbox Code Playgroud)
但是 name 和percentChange 的数据为空,应该“-”表示名称,“-10.0”表示percentChange。如果服务器不发送名称和percentChange,默认值有效,但如果发送空默认值无效!
我使用 converter-moshi:2.4.0 和改造: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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3257 次 |
| 最近记录: |