Moshi / Kotlin – Как сериализовать строки NULL JSON в пустые строки?

Я пытаюсь написать нуль-безопасный адаптер String, который будет сериализовать этот JSON {"nullString": null} следующим образом: Model(nullString = "") чтобы любой JSON с нулевым значением, который я ожидаю быть Строка будет заменена на "" (если существует класс данных, подобный этому: data class Model(val nullString: String) )

Я написал пользовательский адаптер, чтобы попытаться справиться с этим:

 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) } } 

… в попытке решить эту ошибку синтаксического анализа:

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

Моши синтаксический код:

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

Что мне здесь не хватает? Еще новичок в моши, поэтому любая помощь ценится!

Непосредственной проблемой является отсутствие reader.nextNull() для использования нулевого значения.

Есть еще пара других вещей, которые вы можете сделать здесь. С @FromJson реализация JsonAdapter не нужна. Кроме того, JsonReader и JsonWriter не имеют значения NULL.

 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 "" } } 

и используйте добавочный адаптер:

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