Нужна помощь при разборе с JSON - PullRequest
0 голосов
/ 03 июля 2018

Я абсолютный новичок в программировании и Swift. Одной из функций, которые должно иметь мое приложение, является метка текущей температуры в Нью-Йорке. Проблема в том, что я не знаю, нахожусь ли я на правильном пути с моим кодом. Я пробовал вещи из многих видео и статей, но ничего не получается. Я уверен, что ответ очень прост. Спасибо за любую помощь! Я использую даркский API. Это мой текущий код.

import UIKit

struct MyGitHub: Codable {
let temperature: Int

    private enum CodingKeys: String, CodingKey {
        case temperature
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.


        guard let gitUrl = URL(string: "here is my darksky api") else { return }
        URLSession.shared.dataTask(with: gitUrl) { (data, response, error) in
            guard let data = data else { return }
            do {
                let decoder = JSONDecoder()
                let gitData = try decoder.decode(MyGitHub.self, from: data)
                print (gitData.temperature)

            } catch let err {
                print ("Err", err)
            }

        } .resume()    
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }        
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вам нужна структура зонтика для корневого объекта и значение для ключа temperature равно Double, а не Int

struct Root: Decodable {
    let currently : MyGitHub
}

struct MyGitHub: Decodable {
    let temperature: Double
}

...


let gitData = try decoder.decode(Root.self, from: data)
print(gitData.currently.temperature)
0 голосов
/ 03 июля 2018

Вы можете попробовать это

Alamofire.request(urlStr, method: .get, parameters:nil, encoding: JSONEncoding.default).responseJSON { response in

    if  let json = response.result.value as? [String:Any] {

        if let  main = json["currently"] as? [String:Any] {

            if let temp = main["temperature"] as? NSNumber
            {
               // set lbl here

                print(temp)
            }
       }
   }
}

OR

struct Currently : Codable {

    var currently:InnerItem
}

struct InnerItem : Codable {

    var temperature:Double
}

с

guard let gitUrl = URL(string:urlStr) else { return }
URLSession.shared.dataTask(with: gitUrl) { (data, response, error) in
    guard let data = data else { return }
    do {
        let decoder = JSONDecoder()
        let gitData = try decoder.decode(Currently.self, from: data)
        print ("sdhjsdjhjhdshjshjsjhddhsj" , gitData.currently.temperature)

    } catch let err {
        print ("Err", err)

    }


    } .resume()
...