我想将下面的JSON API响应解析为对象列表。如您所见,字段“record”是多态的。
[
{
"t_id": "638975A6-3E5A-4D38-82A0-1CEF7A006AC6",
"table": "ticket",
"record": {
"ticket_id": "111",
"fk_project": "29446",
"fk_phase": "64379",
"fk_status": "159406",
// many more different fields
"created": "2023-06-19 15:00:26"
}
},
{
"t_id": "912975A6-AB5A-5D40-12B2-1CEF7AAAAC23",
"table": "comment",
"record": {
"comment_id": "25666",
"role_id": "71758",
"resource": "list",
// many more different fields
"created": "2023-10-03 22:28:21"
}
}
]
字符串
我使用莫希的代码如下所示:
@GET("api")
suspend fun api(): Response<List<MyResponse>>
@JsonClass(generateAdapter = true)
data class MyResponse(
val t_id: String,
val table: String,
val record: Map<String, String?>
)
型
但是我的实现得到了com.squareup.moshi.JsonEncodingException: Use JsonReader.setLenient(true) to accept malformed JSON at path $
。
我见过this question,但在我的情况下,不只是2种类型,而是100+(ticket,comment,issue. 100多)。我也不能使用Polymorphic Adapter,因为同样的原因。我如何将这个多态字段解析为Map<String, String?>
?
1条答案
按热度按时间fzsnzjdm1#
结果证明,将多态字段解析为
Map<String, String?>
没有问题。根本原因是okhttp。我手动将Content-Encoding设置为gzip,这禁用了okhttp解压缩,所以我的json响应是一个压缩的胡言乱语。
显然,设置这个头是不应该做的,除非你想自己定制解压缩。Okhttp添加这个头并在幕后解压缩。参见this。