web-dev-qa-db-fra.com

la valeur par défaut dans la classe de données kotlin ne fonctionne pas lorsque le serveur envoie la valeur null pour cette valeur dans moshi

J'utilise Moshi pour analyser JSON à partir du serveur. si le serveur envoie null pour la valeur par défaut de l'élément non défini! mais le serveur n'envoie pas cet ensemble de valeurs par défaut.

json:

{"percentChange": null,"change": "-2500.00","value": "130000","name": null}

classe de données:

@JsonClass(generateAdapter = true) data class Reference(val name:String? = "-",val value: Double,val change: Double,val percentChange: Double? = -10.0,)

mais les données pour name et percentChange sont nulles et doivent "-" pour name et "-10.0" pour percentChange. si le serveur n'envoie pas le nom et percentChange, la valeur par défaut fonctionne, mais si la valeur par défaut null est envoyée, elle ne fonctionne pas!

J'utilise converter-moshi: 2.4.0 et post-conversion: 2.4.0

4
h.kelidari

Cela fonctionne comme prévu car le littéral nul en tant que valeur d'une clé en JSON est sémantiquement différent de l'absence de la clé et de la valeur.

Vous pouvez créer un JsonAdapter personnalisé pour votre cas d'utilisation.

@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)
}
1
Eric Cochran