значение по умолчанию в классе данных kotlin не работает, когда сервер отправляет ноль для этого значения в moshi - PullRequest
0 голосов
/ 28 ноября 2018

Я использую Moshi для разбора JSON с сервера.если сервер отправляет ноль для элемента, значение по умолчанию не установлено!но сервер не отправляет значение этого элемента по умолчанию.

json:

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

класс данных:

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

, но данные для name и процентChange равны нулю, что должно "- "для имени и" -10.0 "для процента.если сервер не отправляет имя и процентChange, значение по умолчанию работает, но если отправить это нулевое значение по умолчанию не работает!

Я использую converter-moshi: 2.4.0 и дооснащение: 2.4.0

1 Ответ

0 голосов
/ 04 декабря 2018

Это работает так, как задумано, поскольку нулевой литерал в качестве значения ключа в JSON семантически отличается от отсутствия ключа и значения.

Вы можете создать собственный 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)
}
...