Декодирование JSON в Swift 5

Простой способ декодирования JSON в структуру в Swift без использования сторонних библиотек (регистрации и смс).

Допустим, имеется JSON файл, из которого нужно взять определённые данные:

[
  {
    "name": "Qui-Gon Jinn",
    "lighsaber_color": "Green"
  },
  {
    "name": "Obi-Wan Kenobi",
    "lighsaber_color": "Blue"
  }
]

В далёком Swift 4 были введены протоколы Codable и Decodable для (де)кодирования кастомных типов, именно такой понадобится для структуры, которая повторяет строение JSON файла:

struct Jedi: Codable {
    var name: String
    var lighsaberColor: String
}

Для того, чтобы декодировать строку из JSON в нашу структуру, можно использовать встроенный в Foundation класс JSONDecoder:

func decodeJedi() {
    let jsonString = """
    [
        {
        "name": "Qui-Gon Jinn",
        "lighsaber_color": "Green"
        },
        {
        "name": "Obi-Wan Kenobi",
        "lighsaber_color": "Blue"
        }
    ]
    """

    let jsonData = Data(jsonString.utf8)
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    decoder.dateDecodingStrategy = .secondsSince1970
    do {
        let people = try decoder.decode([Jedi].self, from: jsonData)

        print(people)
        print(people[0].name)
        print(people[1].lighsaberColor)
    } catch {
        print(error.localizedDescription)
    }
}

В jsonString хранится json-файл, нужный для примера. Он переводится в decoder с помощью JSONDecoder(). Дальше в people мы читаем нужную нам информацию в формат нашей структуры Jedi.

Важная деталь, которую не всегда указывают в туториалах - кастомизированное форматирование JSON:

  • .convertFromSnakeCase переводит snake case, используемый в веб-программировании, в более привычный iOS camel case
  • .secondsSince1970 переводит время в удобный формат

March 9, 2020