Как проанализировать JSON с N дочерними объектами - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь проанализировать ответ JSON, полученный от стороннего API.

Ответ возвращает объект json с N дочерними объектами.

Все дочерние элементы соответствуют одному и тому жемодель / класс, но количество детей может измениться.

Если бы это был массив объектов, это было бы тривиально, но я не уверен, как это сделать с объектом, содержащим N объектов.

Я считаю, что мне нужен специальный тип адаптера, но я не могу его сделать.

Вот JSON:

"api":{
   "results": 94
   "leagues": {
         "1":{
            "league_id":"1"
            "name":"2018 Russia World Cup"
            "country":"World"
            "season":"2018"
            "season_start":"2018-06-14"
             }
         "2":{...}
         "3":{...}
         "4":{...}
         ...
         "N":{...}
          }
      }

Так что в основном это "лиги"объект, который я пытаюсь разобрать.

Я надеюсь получить List<League>

Например, корневой объект может иметь эту модель:

class Api {
   val results: Int
   val leagues: List<League>
}

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вы можете создать список лиг в специальном адаптере.

data class Api(val results: Int, val leagues: List<League>)

object LeagueListAdapter {
  @FromJson fun fromJson(reader: JsonReader, leagueAdapter: JsonAdapter<League>): List<League> {
    reader.beginObject()
    val result = mutableListOf<League>()
    while (reader.hasNext()) {
      reader.skipName()
      result += leagueAdapter.fromJson(reader)!!
    }
    reader.endObject()
    return result
  }
}

Не забудьте добавить адаптер при создании экземпляра Moshi (Moshi.Builder.add).

0 голосов
/ 28 декабря 2018

Лично я бы пошел на Map<String, League> (при условии, что записи на карте будут иметь класс League) для типа leagues.

class Api {
  val results: Int
  val leagues: Map<String, League>
}

Я думаю, что вещиРассмотрим здесь в основном в порядке, я полагаю.Если вам нужно сохранить порядок записей, я не уверен, что Moshi сделает это автоматически или вам нужно использовать конкретную реализацию Map, чтобы гарантировать это.

...