【问题标题】:How to parse JSON with N child objects如何使用 N 个子对象解析 JSON
【发布时间】:2019-05-26 04:30:01
【问题描述】:

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

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

孩子都符合相同的模型/类,但孩子的数量可以改变。

如果它是一个对象数组,这将是微不足道的,但我不确定如何处理一个包含 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>
}

【问题讨论】:

  • JSON 永远不是对象;它总是一个字符串。请添加预期的输出,因为不清楚您想要实现什么。要解析 JSON,您总是使用 JSON.parse(str)
  • 你想用 Java 实现吗?
  • 我是用 kotlin 写的,但是 java 没问题。我认为我需要的自定义类型适配器正是我想要的灵感来源。
  • @AndersPedersen 我认为,如果您想将联赛存储为列表。最好重新设计您的 json 数据,如下所示。 { "api": { "results": 94, "leagues": [ { "league_id": "1", "name": "2018 Russia World Cup", "country": "World", "season": "2018", "season_start": "2018-06-14" }, {}, {}, {}, {} ] } }
  • 我同意,但我无法控制数据输出

标签: json retrofit moshi


【解决方案1】:

对于leagues 的类型,我个人会选择Map&lt;String, League&gt;(假设地图中的条目属于League 类)。

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

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

【讨论】:

  • 看来你是对的,如果我使用 Map 而不是 List,Moshi 可以解决。
  • 是的。至于顺序,我不太确定。 Json 没有说字典是有序的,所以我假设 Moshi 也没有将它们按任何特定顺序排列
【解决方案2】:

您可以在自定义适配器中获取联赛列表。

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)。

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多