简体   繁体   English

Swift:解析数据可编码协议不起作用

[英]Swift: Parse data Codable protocol not working

I have a link that returns a json file, I try to print the data but it does not work it is always nil, here is the link: http://heroapps.co.il/employee-tests/ios/logan.json 我有一个返回json文件的链接,我尝试打印数据,但它总是无效,但它总是无效,这里是链接: http : //heroapps.co.il/employee-tests/ios/logan.json

And my code: 而我的代码:

    struct DataClass: Codable {
    let name: String?
    let nickname: String?
    let image: URL?
    let dateOfBirth: Int?
    let powers: [String]?
    let actorName: String?
    let movies: [Movie]?

    enum CodingKeys: String, CodingKey {
        case name = "name"
        case nickname = "nickname"
        case image = "image"
        case dateOfBirth = "dateOfBirth"
        case powers = "powers"
        case actorName = "actorName"
        case movies = "movies"
    }
}

struct Movie: Codable {
    let name: String?
    let year: Int?

    enum CodingKeys: String, CodingKey {
        case name = "name"
        case year = "year"
    }
}
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


        guard let gitUrl = URL(string: "http://heroapps.co.il/employee-tests/ios/logan.json") 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(Movie.self, from: data)
                    print(gitData.name ?? "") //Print nil

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

            }.resume()

    }

Thank you for helping me find where my error comes from, this is the first time I use this method to retrieve JSON data 感谢您帮助我找到错误的出处,这是我第一次使用此方法检索JSON数据

You are not parsing the top level of the JSON. 您没有解析JSON的顶层。 ( success , errorCode , message and data ). successerrorCodemessagedata )。

Playground code for testing... 用于测试的游乐场代码...

import Foundation

let jsonData = """
{
  "success": true,
  "errorCode": 0,
  "message": "Succcess",
  "data": {
    "name": "Logan Howlett",
    "nickname": "The Wolverine",
    "image": "http://heroapps.co.il/employee-tests/ios/logan.jpg",
    "dateOfBirth": 1880,
    "powers": [
      "Adamantium Bones",
      "Self-Healing",
      "Adamantium Claws"
    ],
    "actorName": "Hugh Jackman",
    "movies": [
      {
        "name": "X-Men Origins: Wolverine",
        "year": 2009
      },
      {
        "name": "The Wolverine",
        "year": 2013
      },
      {
        "name": "X-Men: Days of Future Past",
        "year": 2014
      },
      {
        "name": "Logan",
        "year": 2017
      }
    ]
  }
}
""".data(using: .utf8)!

struct JSONResponse: Codable {
    let success: Bool
    let errorCode: Int
    let message: String
    let data: DataClass
}

struct DataClass: Codable {
    let name: String?
    let nickname: String?
    let image: URL?
    let dateOfBirth: Int?
    let powers: [String]?
    let actorName: String?
    let movies: [Movie]?

    enum CodingKeys: String, CodingKey {
        case name = "name"
        case nickname = "nickname"
        case image = "image"
        case dateOfBirth = "dateOfBirth"
        case powers = "powers"
        case actorName = "actorName"
        case movies = "movies"
    }
}

struct Movie: Codable {
    let name: String?
    let year: Int?

    enum CodingKeys: String, CodingKey {
        case name = "name"
        case year = "year"
    }
}

do {
    let result = try JSONDecoder().decode(JSONResponse.self, from: jsonData)
    print(result)
} catch {
    print(error)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM