Swift 4.1 Parse Часть JSON - PullRequest
       10

Swift 4.1 Parse Часть JSON

0 голосов
/ 28 июня 2018

Я довольно недавно работал со Swift и хотел бы воспользоваться возможностями Decodable, надеялся на некоторую помощь.

Публичный API, который я потребляю, выдает нужные мне данные под ключом: 'c', но его окружают метаданные. Например:

{
  a: 1,
  b: 2,
  c: [{
      d: 3,
      e: 4
    },
    {
      d: 5,
      e: 6
    }
  ]
}

Я создал такую ​​структуру:

struct Block: Decodable {
   d: Int?
   e: Int?
}

Как и выше, я хотел бы иметь возможность разбирать данные по типу: [Block] из данных в 'c' как быстро (извините), насколько это возможно, и надеялся, что есть 4.1 способ сделать это.

Спасибо за ваше время!

1 Ответ

0 голосов
/ 28 июня 2018

Я думаю, что самый простой ( самый быстрый ) способ - создать две структуры

struct BlockResponse: Decodable {
  let c: [Block]
}

struct Block: Decodable {
  let d: Int?
  let e: Int?
}

, а затем

let result = try decoder.decode(BlockResponse.self, from: jsonResponse)

EDIT: Вы также можете опустить BlockResponse как здесь https://gist.github.com/sgr-ksmt/d3b79ed1504768f2058c5ea06dc93698

с помощью расширения с keyPath:

extension JSONDecoder {
  func decode<T: Decodable>(_ type: T.Type, from data: Data, keyPath: String) throws -> T {
      let toplevel = try JSONSerialization.jsonObject(with: data)
      if let nestedJson = (toplevel as AnyObject).value(forKeyPath: keyPath) {
          let nestedJsonData = try JSONSerialization.data(withJSONObject: nestedJson)
          return try decode(type, from: nestedJsonData)
      } else {
          throw DecodingError.dataCorrupted(.init(codingPath: [], debugDescription: "Nested json not found for key path \"\(keyPath)\""))
      }
  }
}



try decoder.decode([Block].self, from: data, keyPath: "c")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...