【问题标题】:Kotlin - force failing deserialization from json to class, when a non null property not exits in the json?Kotlin - 当json中不存在非空属性时,强制从json到类的反序列化失败?
【发布时间】:2019-08-06 07:06:18
【问题描述】:

假设我们有这个类:

  class Test(@SerializedName("Nullablefield")
             val nullable: Int?,
             @SerializedName("NonNullableField")
             val nonNullable: Int)

我们收到这个 json:

{
    "Nullablefield": 3
}

如您所见,json 中缺少 NonNullableField,

当使用 Gson().fromJson 方法时,属性变为空(即使该属性被定义为非空)

我在执行此操作时阅读了有关 gson 使用不安全方法的信息。

在这种情况下,有没有办法让反序列化过程失败,使用 Gson 或任何其他库?

我不想通过为字段分配默认值来解决它。

【问题讨论】:

  • 尝试设置默认值
  • @AlexandrKolesnik 我不想要默认值。我只是希望它失败。
  • 我的建议是尝试另一个反序列化库,例如实际上是在考虑 Kotlin 支持的情况下编写的(Moshi,Jackson)。编辑:我实际上使用杰克逊,我认为你要求的行为是默认的。无论如何,我会给 moshi 一个机会,它很新,我认为它是用 Kotlin 编写的(或者至少有广泛的 Kotlin 支持),但对你想要的行为一无所知。

标签: kotlin gson


【解决方案1】:

你可以使用Moshi库来解析json

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.squareup.moshi.Moshi

fun main() {
    val json = """
{
    "Nullablefield": 3
}        
    """.trimIndent()
    val moshi = Moshi.Builder().build()
    val adapter = moshi.adapter(Test::class.java)
    val test = adapter.fromJson(json)//will crash
    println(test)
}

@JsonClass(generateAdapter = true)
data class Test(
    @Json(name = "Nullablefield")
    val nullable: Int?,
    @Json(name = "NonNullableField")
    val nonNullable: Int
)

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 2021-02-20
    • 2021-07-08
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多