如何使用N个子对象解析JSON

时间:2018-12-28 10:24:16

标签: json retrofit moshi

我正在尝试解析从第三方API收到的JSON响应。

响应返回一个带有N个子对象的json对象。

所有子代都遵循相同的模型/类别,但是子代的数量可以更改。

如果它是一个对象数组,那将是微不足道的,但是我不确定如何对持有N个对象的对象进行处理。

我相信我需要一个自定义的typeadapter,但似乎无法完成。

这是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 :(得分:0)

我个人会选择Map<String, League>类型的League(假设地图中的条目为leagues类)。

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

我认为这里要考虑的事情主要是关于我想的顺序。如果您需要维护条目的顺序,则不确定Moshi是否自动执行此操作,或者不确定是否需要使用Map的特定实现来保证这一点。

答案 1 :(得分:0)

您可以在自定义适配器中获得联赛排名。

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)时,请不要忘记添加适配器。