Как получить определенные свойства из объекта JSON из HTTP-запроса, используя URLSession - PullRequest
0 голосов
/ 13 ноября 2018

С помощью следующего кода я могу эффективно получить объект JSON, но я не уверен, как это сделать, получить конкретные свойства объекта.

Код Swift

@IBAction func testing(_ sender: Any) {
    let url = URL(string: "http://example.com/cars/mustang")

    let task = URLSession.shared.dataTask(with: url!) { data, response, error in
        guard error == nil else {
            print(error!)
            return
        }
        guard let data = data else {
            print("Data is empty")
            return
        }
        let json = try! JSONSerialization.jsonObject(with: data, options: [])
        print(json)
    }
    task.resume()
}

Вот что я вижу, когда запускаю приведенный выше код ...

Вывод - объект JSON

(
    {
    color = "red";
    engine = "5.0";
    }
)

Как я могу получить только цвет объекта?

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вот как я это сделал ...

@IBAction func testing(_ sender: Any) {
    let url = URL(string: "http://example.com/cars/mustang")

    let task = URLSession.shared.dataTask(with: url!) { data, response, error in
        guard error == nil else {
            print(error!)
            return
        }
        guard let data = data else {
            print("Data is empty")
            return
        }
        let json = try! JSONSerialization.jsonObject(with: data, options: [])

        guard let jsonArray = json as? [[String: String]] else {
            return
        }
        let mustangColor = jsonArray[0]["color"]

        print(mustangColor!)
    }
    task.resume()
}
0 голосов
/ 13 ноября 2018

Создать класс, который подтверждает декодируемый протокол; CarInfo например в вашем случае

class CarInfo: Decodable

Создание атрибутов класса

var color: String

var engine: String

Создание перечисления ключей JSON, которое наследуется от CodingKey

enum CarInfoCodingKey: String, CodingKey {
   case color 
   case engine 
}

внедрить init

required init(from decoder: Decoder) throws

класс будет

class CarInfo: Decodable {
var color: String
var engine: String
enum CarInfoCodingKey: String, CodingKey {
case color
case engine
}
public init(from decoder: Decodabler) throws {
let container = try decoder.container(keyedBy: CarInfoCodingKey.self)
self.color = try container.decode(String.self, forKey: .color)
self.engine = try contaire.decode(String.self, forKey: .engine)
}
}

декодер вызовов

let carinfo = try JsonDecoder().decode(CarInfo.self, from: jsonData)
...