【问题标题】:Moshi deserializing values as nullMoshi 将值反序列化为 null
【发布时间】:2019-04-03 17:47:51
【问题描述】:

我最近从 Gson 切换到 Moshi,但无法解析一些 Json。

{
  "access_token": "-LNe2LQ7DQH5Y2zs_W5iUumKuaUE",
  "token_type": "bearer",
  "device_id": "461f-837e-af5050c92fe9",
  "expires_in": 3600,
  "scope": "*"
}

这是模型类:

data class AuthToken(
        @Json(name = "access_token") val accessToken: String,
        @Json(name = "token_type") val tokenType: String,
        @Json(name = "device_id") val deviceId: String,
        @Json(name = "expires_in") val expiresIn: Int,
        @Json(name = "scope") val scope: String
)

每当我在改造客户端中切换到使用 Moshi 时,都会收到以下错误:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull

我已使该字段可以为空,但是它总是被反序列化为空。我检查了我的改造响应,使用 Gson 或 Moshi 时(显然)是相同的。我究竟做错了什么?

【问题讨论】:

    标签: android oauth-2.0 retrofit2 moshi


    【解决方案1】:

    由于某种原因,当我明确告诉 AuthToken 类生成适配器时 - 我没有收到空值。

    @JsonClass(generateAdapter = true)
    data class AuthToken(
            @Json(name = "access_token") val accessToken: String,
            @Json(name = "token_type") val tokenType: String,
            @Json(name = "device_id") val deviceId: String,
            @Json(name = "expires_in") val expiresIn: Int,
            @Json(name = "scope") val scope: String
    )
    

    【讨论】:

    • 如果您不使用 Moshi 的 Kotlin 支持(反射 KotlinJsonAdapterFactory 或 codegen 适配器),@Json 名称将无法正确读取。 (它们没有添加到字段中,默认反射 Java 适配器看不到它们。)
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 2016-09-16
    • 2020-06-23
    • 1970-01-01
    • 2012-06-30
    • 2012-03-25
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多