Как разобрать список json, когда отдельные элементы списка не одного формата с помощью Retrofit и Gson? - PullRequest
0 голосов
/ 10 июля 2020

Я использую Retrofit и Gson для связи с сервером и анализа ответов.

Я получаю список объектов 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 поле - это просто список (в первом примере). Иногда это поле представляет собой трехуровневый глубокий список (во втором примере).

В результате этого я не могу правильно проанализировать список, поскольку формат элементов в списке отличается.

Как я могу правильно разобрать это?

В настоящее время я использую этот класс данных:

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

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

1 Ответ

0 голосов
/ 10 июля 2020

Если вы знаете, что существует 2 версии файла, создайте по одному внутреннему классу для каждого файла. Во время синтаксического анализа определите тип «координат», если это 1-й тип, продолжайте с 1-го, если второй, продолжайте со вторым

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)
}
...