在swift代码应用程序中获取和解析JSON

在swift代码应用程序中获取和解析JSON,json,swift,Json,Swift,我想获得获取JSON并在iPhone或tvOS应用程序中解析它的经验。在操场上我让它工作。但现在在iPhone或tvOS应用程序中,我都无法将数据输入标签 在代码故障排除方面获得了帮助,观看了youtube JSON解析和swift视频,但运气不好,这是一个非常小的问题,我确信,我忽略了它 import UIKit class ViewController: UIViewController { @IBOutlet weak var Title_Label: UILabel! ov

我想获得获取JSON并在iPhone或tvOS应用程序中解析它的经验。在操场上我让它工作。但现在在iPhone或tvOS应用程序中,我都无法将数据输入标签

在代码故障排除方面获得了帮助,观看了youtube JSON解析和swift视频,但运气不好,这是一个非常小的问题,我确信,我忽略了它

import UIKit

class ViewController: UIViewController {

  @IBOutlet weak var Title_Label: UILabel!

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

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

  @objc func getNewTitles(){
    struct ToDo : Decodable {
       let userId, id : Int
       let title : String
       let completed : Bool
    }

    let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
    URLSession.shared.dataTask(with:url) { data, _, error in
      guard let data = data else { print(error!); return }

      do {
        let todo = try JSONDecoder().decode(ToDo.self, from: data)

        // get the values out of the struct
        let newsstring = (todo.title)
        self.Title_Label.text = newsstring
        //print(todo.userId)
        //print(todo.id)
        //print(todo.completed) 
      } catch {
        print(error)
      }
    }.resume()
  }
}
问题在最后一部分

为什么需要自我标题标签


代码没有给出错误,但文本没有发送到我的TVos屏幕上的标签中?

首先,请根据命名约定对标签进行命名

您必须调用方法来检索viewDidLoad中的数据。在这种情况下,不需要将其标记为@objc

正如评论中提到的,您必须更新主线程上的标签

do {
    let todo = try JSONDecoder().decode(ToDo.self, from: data)

    DispatchQueue.main.async {
        self.titleLabel.text = todo.title
    } 
} catch { ...
并至少在类或更高级别的范围内声明结构

class ViewController: UIViewController {

    struct ToDo : Decodable {
       let userId, id : Int
       let title : String
       let completed : Bool
    }

...

您显示的代码中没有调用getNewTitles的地方。你确定会发生这种情况吗?无关:self.Title\u label.text=newstring必须在主线程上运行,将其括起来DispatchQueue.main.sync{…}。谢谢@Gereon,很好,我忽略了getNewTitles部分。仍然没有错误或输出。self.Title\u label.text=newstring必须在主线程上运行,请将其括在DispatchQueue.main.sync中,这是什么意思。我甚至不确定这是否是正确的方法-Xcode建议修复早期的错误。谢谢@vadian。好的是,现在它可以编译和构建,但它会给出一个异常处理错误。所以我现在遇到了一些错误。当然,在重命名标签后,您必须在Interface Builder中断开并重新连接它以应用更改。您是对的,再次使用thx@Vadian。全部编译成功。不幸的是,我的屏幕上的标签上没有数据。我今天可以再偷你的大脑一点,问一下,你将在哪里调用函数getNewTitles吗?如果你这样做的话?还是有更聪明、更简单的方法。让url=URLstring:!URLSession.shared.dataTaskwith:url{data,u,guard let data=data else{printerror!return}do{let todo=try JSONDecoder.decodeToDo.self,from:data DispatchQueue.main.async{self.titleLabel.text=todo.title}使用调试器。设置断点。dataTask是否已执行?通常在viewDidLoad中调用getNewTitles。
do {
    let todo = try JSONDecoder().decode(ToDo.self, from: data)

    DispatchQueue.main.async {
        self.titleLabel.text = todo.title
    } 
} catch { ...
class ViewController: UIViewController {

    struct ToDo : Decodable {
       let userId, id : Int
       let title : String
       let completed : Bool
    }

...