使用莫希解析json,其中一个字段是多态的

ldioqlga  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(156)

我想将下面的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?>

fzsnzjdm

fzsnzjdm1#

结果证明,将多态字段解析为Map<String, String?>没有问题。
根本原因是okhttp。我手动将Content-Encoding设置为gzip,这禁用了okhttp解压缩,所以我的json响应是一个压缩的胡言乱语。
显然,设置这个头是不应该做的,除非你想自己定制解压缩。Okhttp添加这个头并在幕后解压缩。参见this

相关问题