首页 > 解决方案 > 如何使用 Swift 4.2 解决 JSON 可解码错误异常?

问题描述

我的场景,我试图data从. 虽然我从 JSON过程中得到时间。在我使用的 JSON 响应下方,我无法获得准确的. 请提供一些建议JSONtableViewcompilebadexceptiondecodableissues

我的 JSON 响应

{
  "status": true,
  "status_code": 1,
  "data": [
    {
      "cat_id": "1",
      "cat_name": "Food",
      "cat_parentid": "2",
      "name": "guru",
      "year": "3000",
      "fullname": {
        "firstname": "jio",
        "lastname": "jack"
      },
      "address": {
        "city": "sanfrancisco",
        "state": "california"
      },
      "ship": {
        "captian": "mojo",
        "time": "12.30.01"
      }
    }
   ]
}

我的可解码

struct Root: Decodable {
    let catID, catName, catParentid, name, year: String?

    private enum CodingKeys: String, CodingKey {
        case catID = "cat_id"
        case catName = "cat_name"
        case catParentid = "cat_parentid"
        case name, year
    }
}

我的 JSON 代码

func parseJSON() {

        let url = URL(string: "https://...")

        let task = URLSession.shared.dataTask(with: url!) {(data, response, error) in

        guard error == nil else {
            print("returning error")
            return
        }

        guard let content = data else {
            print("not returning data")
            return
        }

        guard let json = (try? JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [String: Any] else {
            print("Error")
            return
        }

            do {
                let content = json["data"] as! [[String:String]]
                let staData = try JSONSerialization.data(withJSONObject:content,options:[])
                self.tableArray = try JSONDecoder().decode([Root].self, from:staData)
            }
            catch {
                print(error)
            }

        print(self.tableArray)

        DispatchQueue.main.async {
            self.tableView.reloadData()
        }

        }
        task.resume()
    }

我的问题

问题屏幕

标签: jsonswift

解决方案


您需要编写结构以完全匹配 JSON 数据的结构,如下所示:

struct Root: Codable {
    let status: Bool
    let statusCode: Int
    let data: [Datum]

    enum CodingKeys: String, CodingKey {
        case status
        case statusCode = "status_code"
        case data
    }
}

struct Datum: Codable {
    let catID, catName, catParentid, name: String
    let year: String
    let fullname: Fullname
    let address: Address
    let ship: Ship

    enum CodingKeys: String, CodingKey {
        case catID = "cat_id"
        case catName = "cat_name"
        case catParentid = "cat_parentid"
        case name, year, fullname, address, ship
    }
}

struct Address: Codable {
    let city, state: String
}

struct Fullname: Codable {
    let firstname, lastname: String
}

struct Ship: Codable {
    let captian, time: String
}

有了这些,您可以简单地使用JSONDecoder而无需任何JSONSerialization


推荐阅读