Swift 4 - Json декодер - PullRequest
       83

Swift 4 - Json декодер

0 голосов
/ 27 сентября 2018

Я много искал и старался изо всех сил, но я застрял.

Я пытаюсь извлечь строку из запроса Json (из Pexel API):

Вот мой код дляизвлечь json (с импортированными Alamofire и SwiftyJson)

  func retrieveapi () {

        let apiKey = "563*****************0c7eae"




        let headers: HTTPHeaders = [
            "Authorization": "5********************ae",
            "Accept": "application/json"
        ]

        Alamofire.request("https://api.pexels.com/v1/search?query=Spain+query&per_page=15&page=1", headers: headers).responseJSON { response in
            if let json = response.result.value {

              print ("json \(json)") 
}}}

Журнал печати ("json") ниже

json {
    "next_page" = "https://api.pexels.com/v1/search/?page=2&per_page=15&query=Spain+query";
    page = 1;
    "per_page" = 15;
    photos =     (
                {
            height = 2661;
            id = 52062;
            photographer = "tyler hendy";
            src =             {
                landscape = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=627&w=1200";
                large = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&h=650&w=940";
                large2x = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940";
                medium = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&h=350";
                original = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg";
                portrait = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=1200&w=800";
                small = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&h=130";
                square = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=1200&w=1200";
                tiny = "https://images.pexels.com/photos/52062/pexels-photo-52062.jpeg?auto=compress&cs=tinysrgb&fit=crop&h=200&w=280";
            };
            url = "https://www.pexels.com/photo/water-architecture-colourful-church-52062/";
            width = 4000;
        },
                {  // A lot of more results....

Я просто хочу извлечь:

Первый результат "ландшафта".

Я пытался передать его в Dict, в массив, чтобы сделать его кодируемым ... но это было неудачно.Может ли кто-нибудь любезно помочь мне и сказать мне, как я могу извлечь Первый (только первый) результат "пейзажа"?

Большое спасибо!

Редактировать: нашел его и спасибо за советы!

Я ставлю это для тех, кто застрял, как я ..

    if let dictionary = response.result.value as? [String : AnyObject]{
        let listData = dictionary["photos"] as! [[String : AnyObject]]
        let photoDict = listData[1]
        let srcDict = photoDict["src"]
        let landscapeStr = srcDict!["landscape"]
        print ("landscapeStr \(landscapeStr!)")

    }   }

1 Ответ

0 голосов
/ 27 сентября 2018

Просто используйте Decodable.

struct Post : Decodable {

    var photo : Photo?
} 

struct Photo : Decodable {

    var source : Source?
}

struct Source : Decodable {

    var landscape : String?
}

Alamofire.request("https://api.pexels.com/v1/search?query=Spain+query&per_page=15&page=1", headers: headers).responseJSON { response in
    guard let data = response.results.value {

         let post = createObject(json: data, decodable: Post.self)
    }
}

func createObject<D: Decodable> (json : [String: Any], decodable: D.Type) throws -> D {
    return try JSONDecoder().decode(decodable, from: JSONSerialization.data(withJSONObject: snapshot, options: JSONSerialization.WritingOptions.sortedKeys))
}
...