android - Kotlin Gson 空值
问题描述
我正在尝试形成这种类型的 JSON:
"answer_id":123,
"question_id":4567,
"value":"null"
但是,我无法将 NULL 值放在值键上,似乎 Gson 只是忽略了该字段,所以在序列化之后我得到
"answer_id":123,
"question_id":4567
所以我的服务器抛出了错误的请求。我serializeNulls()
在 Gson builder 中使用它应该允许可为空的值,但它对我不起作用。有谁知道是什么问题?
@Parcelize
data class AnswerHelperObject(@SerializedName("question_id") val questionId: Int,
@SerializedName("value") val value: String? = null,
@SerializedName("answer_id") val answerId: Int?)
: Parcelable {}
解决方案
由于您以字符串形式接收值,因此 Gson 会将其解析为字符串“null”,因此如果您希望将字段值设为 null,则可以编写自定义反序列化器。
AnswerHelperObject
data class AnswerHelperObject(
var answer_id: Int,
var question_id: Int,
var value: String?
)
AnswerHelperObjectDeserializer
class AnswerHelperObjectDeserializer: JsonDeserializer<AnswerHelperObject>{
override fun deserialize(json: JsonElement, typeOfT: Type?, context: JsonDeserializationContext?): AnswerHelperObject {
val answerHelperObject = Gson().fromJson(json.asJsonObject, AnswerHelperObject::class.java)
if (answerHelperObject.value == "null") {
answerHelperObject.value = null
}
return answerHelperObject
}
}
您可以看到测试场景。
class AnswerHelperObjectTest {
@Test
fun answer_object_parse_as_null_string() {
val json = "{\"answer_id\":123,\n" +
"\"question_id\":4567,\n" +
"\"value\":\"null\"}"
val answerHelperObject = Gson().fromJson(json, AnswerHelperObject::class.java)
// value is parsed as string of value null
assertEquals(answerHelperObject.value, "null")
}
@Test
fun answer_object_parse_null() {
val json = "{\"answer_id\":123,\n" +
"\"question_id\":4567,\n" +
"\"value\":\"null\"}"
val gson = GsonBuilder()
.registerTypeAdapter(AnswerHelperObject::class.java, AnswerHelperObjectDeserializer())
.create()
val answerHelperObject = gson.fromJson(json, AnswerHelperObject::class.java)
// value is deserialized as null
assertEquals(answerHelperObject.value, null)
}
}
推荐阅读
- python - 如何在熊猫中附加两个数据框
- javascript - Jquery datepicker 在 laravel 中的 Vue.js 组件的 v-for 中不起作用
- sql-server - 想要在第 5 和第 6 '/' 之间的字符串输出
- excel - VBA 设置多个过滤器
- powershell - 获取 Get-MailboxStatistics,ItemCount 作为变量
- java - 字节数组进入灰度。安卓拍照
- python - 如何从同时列出数据和模式的 JSON 文件创建 Spark-SQL 数据框
- python - 是否可以在 Python 中的 Azure Function Linux 消耗计划中保存临时文件?
- java - 如何在控制器级别集成测试中使用 FakeMongo 和忽略 MongoDB 套接字连接
- javascript - 我的事件只有在被调用时才会触发