【问题标题】:Need help by parsing with JSON使用 JSON 解析需要帮助
【发布时间】:2018-12-11 20:17:01
【问题描述】:

我是编程和 Swift 的初学者。我的应用程序应该具有的功能之一是纽约市当前温度的标签。问题是我不知道我的代码是否走在正确的道路上。我尝试了许多视频和文章中的东西,但似乎没有任何效果。我相信答案很简单。谢谢你的帮助! 我使用darksky 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.
    }        
}

【问题讨论】:

标签: json swift url weather


【解决方案1】:

你可以试试这个

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)
            }
       }
   }
}

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()

【讨论】:

    【解决方案2】:

    您需要根对象的伞形结构,并且键 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多