Feed不一致时解码JSON-Swift

时间:2019-05-27 02:01:26

标签: ios json swift decodable

当Feed给我两个不同的结果时,我不知道如何使用可解码协议快速处理JSON Feed。如果有多个“入口”,则json看起来像这样,并且入口值是对象数组

{
  "feed": {
    "publisher": "Penguin",
    "country": "ca"
  },
  "entry": [
    {
      "author": "Margaret Atwood",
      "nationality": "Canadian"
    },
    {
      "author": "Dan Brown",
      "nationality": "American"
    }
  ]
}

但是,如果只有一个条目,则json看起来像这样,其中条目只是一个字典

{
  "feed": {
    "publisher": "Penguin",
    "country": "ca"
  },
  "entry": {
    "author": "Margaret Atwood",
    "nationality": "Canadian"
  }
}

要解码第一种情况,我将使用以下结构

struct Book: Decodable {
    let feed: Feed
    let entry: [Entry]
}

// MARK: - Entry
struct Entry: Decodable {
    let author, nationality: String
}

// MARK: - Feed
struct Feed: Decodable {
    let publisher, country: String
}

然后使用类似的方法对检索到的数据进行解码

 let  object = try JSONDecoder().decode(Book.self, from: data)

当条目不是对象的数组时,该如何处理?

1 个答案:

答案 0 :(得分:3)

您可能会覆盖Book的解码器。您可以做的是尝试打开[Entry]的包装,如果失败,只需尝试打开单个Entry的包装。

例如:

glob "\Q$path/test/*/"

注意:这不是您想要做的事情的完整示例,而只是一种可以完成自己想做的事情的方式