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

March 9, 2020

Простой способ декодирования 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 переводит время в удобный формат