【问题标题】:Moshi can't convert Json when Date item is null当 Date 项目为空时,Moshi 无法转换 Json
【发布时间】:2020-01-27 09:12:24
【问题描述】:

我在我的应用程序中使用了 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 客户适配器:

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

Moshi 的错误形式:

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

【问题讨论】:

    标签: android date moshi data-class


    【解决方案1】:

    试试这个:

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

    【讨论】:

      【解决方案2】:

      使用可以通过检查JsonReader.Token轻松处理:

      @FromJson
      override fun fromJson(reader: JsonReader?): Date? {
        return try {
      
          val dateAsString = if (reader?.peek() == JsonReader.Token.NULL) 
          reader?.nextNull() else reader?.nextString()
      
          synchronized(dateFormat) {
              dateFormat.parse(dateAsString)
          }
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-11-11
        • 1970-01-01
        • 2016-04-28
        • 2018-09-11
        • 2021-04-10
        • 2021-05-13
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多