Moshi / Kotlin – ¿Cómo serializar cadenas NULL JSON en cadenas vacías?

Estoy intentando escribir un adaptador String nulo seguro que {"nullString": null} este JSON {"nullString": null} en esto: Model(nullString = "") para que cualquier JSON con un valor 'nulo' que espero sea un La cadena se replaceá por "" (suponiendo que exista una class de datos como esta: data class Model(val nullString: String) )

Escribí un adaptador personalizado para tratar de manejar esto:

 class NullStringAdapter: JsonAdapter<String>() { @FromJson override fun fromJson(reader: JsonReader?): String { if (reader == null) { return "" } return if (reader.peek() == NULL) "" else reader.nextString() } @ToJson override fun toJson(writer: JsonWriter?, value: String?) { writer?.value(value) } } 

… en un bash de resolver este error de análisis:

com.squareup.moshi.JsonDataException: Expected a name but was NULL at path $.nullString

Código de análisis Moshi:

 val json = "{\"nullString\": null}" val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .add(NullStringAdapter()) .build() val result = moshi.adapter(Model::class.java).fromJson(configStr) 

¿Que me estoy perdiendo aqui? ¡Todavía nuevo para moshi así que cualquier ayuda es apreciada!

    El problema inmediato es la llamada reader.nextNull() falta para consumir el valor nulo.

    También hay otras cosas de limpieza que puedes hacer aquí. Con @FromJson , implementar JsonAdapter es innecesario. Además, JsonReader y JsonWriter no son anulables.

     object NULL_TO_EMPTY_STRING_ADAPTER { @FromJson fun fromJson(reader: JsonReader): String { if (reader.peek() != JsonReader.Token.NULL) { return reader.nextString() } reader.nextNull<Unit>() return "" } } 

    y use agregar el adaptador:

     val moshi = Moshi.Builder() .add(NULL_TO_EMPTY_STRING_ADAPTER) .add(KotlinJsonAdapterFactory()) .build()