Moshi не может конвертировать Json, когда элемент Date пуст - PullRequest
0 голосов
/ 27 января 2020

Я использую Moshi в своем приложении и для своих Date, которые я получу от сервера, я только что определил пользовательский адаптер для Moshi, но в результате получится, что когда моя дата будет нулевой, Moshi не могу конвертировать JSON в мою модель, поэтому выдает ошибку, как показано ниже:

Это мой класс данных:

@JsonClass(generateAdapter = true)
data class BoughtSmart(
        var id: Int?,
        var title: String?,
        @Json(name = "start_date") var startDate: Date?,
        @Json(name = "expire_date") var expireDate: Date?,
        @Json(name = "created_time") var createdTime: Date?,
        @Json(name = "modified_time") var modifiedTime: Date?
)

Мой адаптер Moshi Custome:

class CustomDateAdapter : JsonAdapter<Date>() {

    private val dateFormat = SimpleDateFormat(SERVER_FORMAT, Locale.ENGLISH)
    private val TAG = CustomDateAdapter::class.java.simpleName
    @FromJson
    override fun fromJson(reader: JsonReader?): Date? {

        var dateAsString = ""

        reader?.apply {
            try {
                dateAsString = nextString()
            } catch (e: Exception) {
                Log.e(TAG, "Error [${e}]")
            }
        }

        return dateFormat.parse(dateAsString)
    }

    @ToJson
    override fun toJson(writer: JsonWriter, value: Date?) {
        if (value != null) {
            writer.value(value.toString())
        }
    }

    companion object {
        const val SERVER_FORMAT = ("yyyy-MM-dd'T'HH:mm:ss")
    }
}

Форма ошибки Моши:

com.squareup.moshi.JsonDataException: Expected a string but was NULL at path $.results[0].expire_date

1 Ответ

0 голосов
/ 27 января 2020

Попробуйте это:

        reader?.apply {
            try {
               if (peek() == JsonToken.STRING) {
                dateAsString = nextString()
               } else {
                 nextNull()
               }
            } catch (e: Exception) {
                Log.e(TAG, "Error [${e}]")
            }
        }
...