如何使用 Moshi 和 Retrofit 将非结构化 JSON 转换为 POJO

How to convert unstructured JSON to POJO using Moshi and Retrofit

我遇到了一个问题,我们得到的一些响应不能直接解析并将其转换为 POJO。我得到的响应格式如下

[
  "list",
  [
    {
      "@type": "com.exampe.model.ModelName",
      "number": 1,
      "name": "Test Name",
      "url": "/test/url/",
      "type": "f"
    }
  ]
]

我想忽略那个“列表”并解析对象 ModelName 列表中的 POJO。我正在使用 Retrofit 和 Moshi Convertor,但我不确定如何实现。有什么方法可以在响应传递给 Moshi Convertor 之前拦截响应,或者我可以采用任何不同的方法。

改造代码段

private fun getRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl(BuildConfig.API_URL)
            .addConverterFactory(MoshiConverterFactory.create())
            .client(getHTTPClient())
            .build()
    }

Retrofit 提供自定义转换器(参见官方文档),moshi 也应该提供类似的东西。

我没有使用 moshi 的经验,但我检查了文档和源代码 - 看起来是可行的。

Moshi offers custom adapters which should do things you need. Take a look on PolymorphicJsonAdapterFactory,它有方法 fromJson()toJson() 允许您以您喜欢的方式手动解析 json 元素。

甚至更多。 PolymorphicJsonAdapterFactory 看起来是您需要的选项。

A JsonAdapter factory for objects that include type information in the JSON. When decoding JSON. Moshi uses this type information to determine which class to decode to. When encoding Moshi uses. the object’s class to determine what type information to include.