Войти

Parse JSON

Для работы с JSON у Swift есть много отличных инструментов. Но мы рассмотрим библиотеку, которая позволяет элегантно работать с опциональными типами, получать массивы значений и является очень легковесной:

Установка

Для установки зависимости, вы можете перетащить файл SwiftyJSON в Ваш Xcode проект или использовать Cocoapods. Для это в podfile укажите следующую зависимость и введите pod update:

pod 'SwiftyJSON'

Это автоматически установит последнюю версию SwiftyJSON в Ваш проект.

Инициализация

Автор учел несколько способ инициализации, что позволит вам не форматировать данные, даже если они не соответсвуют формату. Список инициализаторов выглядит так:

let json = JSON(data: dataFromNetworking)let json = JSON(jsonObject)if let dataFromString = jsonString.data(using: .utf8, allowLossyConversion: false) {
 let json = JSON(data: dataFromString)
}

Получаем значения

Одной из крутых особенностей работы с SwiftyJSON является работа с получением значений. Вы можете избавится от проверки на nil переменных:

// Getting a string from a JSON Dictionary
let name = json["name"].stringValue

Если вы все таки хотите получить nil, если значение отстуствует, достаточно вызывать следующий код:

// Name is optional
let name = json["name"].string

Subscript

Приведем пару примеров работы с массивами:

// Getting an array of string from a JSON Array
let arrayNames =json["users"].arrayValue.map {$0["name"].stringValue}// Getting a string using a path to the element
let path: [JSONSubscriptType] = [1,"list",2,"name"]
let name = json[path].string// Just the same
let name = json[1]["list"][2]["name"].string// Alternatively
let name = json[1,"list",2,"name"].string// With a custom way
let keys: [JSONSubscriptType] = [1,"list",2,"name"]
let name = json[keys].string

Файл

Иногда .json расположен внутри проекта. Чтобы обратится к ресурсу, достаточно вызывать следующий код:

let path = Bundle.main.path(forResource: "NAME_FILE", ofType: "json")!
let jsonString = try? String(contentsOfFile: path, encoding: String.Encoding.utf8)
let data = JSON(parseJSON: jsonString ?? "")

Alamofire

Одной из популярных библиотек по работе с сетевым протоколом является Alamofire.

Чаще всего, работа с http, вы будете получать json. Работа в связке будет выглядеть так:

Alamofire.request(url, method: .get).validate().responseJSON { response in
 switch response.result {
 case .success(let value):
  let json = JSON(value)
  print("JSON: \(json)")
 case .failure(let error):
  print(error)
 }
}

Сеттеры

Чтобы изменить значение в json, достаточно обратится по ключю и передать новое значение:

json["name"] = JSON("new-name")
json[0] = JSON(1)json["id"].int =1234567890
json["coordinate"].double =8766.766
json["name"].string ="Jack"
json.arrayObject = [1,2,3,4]
json.dictionaryObject = ["name":"Jack", "age":25]

Стоит глянуть