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