Расшифровка JSON, когда фид несовместим - Swift - PullRequest
0 голосов
/ 27 мая 2019

Я не знаю, как быстро обрабатывать JSON-ленту с декодируемым протоколом, когда фид дает мне два разных результата.Если существует более одной «записи», 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 Ответ

3 голосов
/ 27 мая 2019

Вы можете переопределить декодер для 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]
      }
   }
}

Примечание: это неподробный пример того, что вы хотите сделать, но только способ, которым вы можете сделать то, что вы хотите сделать

...