当列表的各个项目使用Retrofit和Gson的格式不同时,如何解析json列表?

Posted

技术标签:

【中文标题】当列表的各个项目使用Retrofit和Gson的格式不同时,如何解析json列表?【英文标题】:How to parse json list when the list's individual items are not of the same format using Retrofit and Gson? 【发布时间】:2020-10-30 20:33:53 【问题描述】:

我正在使用RetrofitGson 与服务器通信并解析响应。

我正在从服务器接收 geometry 对象列表。但是对象的坐标字段可能会有所不同。例如,我正在从服务器接收以下 json:


  "geometry":
    "type":"Point",
    "coordinates": [
        76.95210456848145,
        43.2790799527603
    ]
  

有时这个对象会以这种格式返回我:


  "geometry":
   "type":"Polygon",
   "coordinates":[
       [
          [76.9478130340576,43.286265501840916],
          [76.9482421875,43.276267985142056],
          [76.95098876953125,43.27101863123778]
       ]
    ]
  

如您所见,有时coordinates 字段只是一个列表(在第一个示例中)。有时,该字段是 3 级深度列表(在第二个示例中)。

因此,由于列表中元素的格式不同,我无法正确解析列表。

我怎样才能正确解析这个?

目前,我正在使用这个数据类:

data class Geometry(
    @SerializedName("coordinates")
    val coordinates: List<List<List<Double>>>,

    @SerializedName("type")
    val type: String)

【问题讨论】:

【参考方案1】:

如果您知道该文件有 2 个版本,请为每个文件创建一个内部类。在解析时,识别“坐标”的类型,如果是第一种,则继续第一种,如果是第二种,则继续第二种

inner class GeometryV2(
  @SerializedName("coordinates")
  val coordinates: List<List<List<Double>>>,

  @SerializedName("type")
  val type: String)

inner class GeometryV1(
  @SerializedName("coordinates")
  val coordinates: List<Double>,

  @SerializedName("type")
  val type: String)

【讨论】:

以上是关于当列表的各个项目使用Retrofit和Gson的格式不同时,如何解析json列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Retrofit2 和 GSON 转换器解决“古怪”的 JSON API

ProGuard for Android 和 Retrofit2 Converter Gson?

如何使用Gson注释解析动态列表?

如何使用Retrofit2,RxJava2,Gson TypeAdapterFActory正确映射Gson?

Retrofit Gson解析空字符串的问题

Android实战——Retrofit2的使用和封装