在 Feed 不一致时解码 JSON - Swift

Decoding JSON when feed is inconsistent - Swift

当提要给我两个不同的结果时,我不知道如何使用可解码协议处理 JSON 中的 swift 提要。如果有多个“条目”,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)

如果条目不是 数组 个对象,我该如何处理?

您可以覆盖 Book 的解码器。您可以做的是尝试解包一个 [Entry],如果失败,就尝试解包一个条目。

例如:

struct Book: Decodable {
   let feed: Feed
   let entry: [Entry] 
   init (from decoder :Decoder) throws {
     let container = try decoder.container(keyedBy: CodingKeys.self)
      do {
        value = try container.decode([Entry].self, forKey: .value)
      } catch {
        let newValue = try container.decode(Entry.self, forKey: .value)
        value = [newValue]
      }
   }
}

注意:这不是关于您想要做什么的综合示例,而只是您可以完成您想要做的事情的一种方式