json - 如何使用 Swift 4.2 解决 JSON 可解码错误异常?
问题描述
我的场景,我试图data
从. 虽然我从 JSON过程中得到时间。在我使用的 JSON 响应下方,我无法获得准确的. 请提供一些建议JSON
tableView
compile
badexception
decodable
issues
我的 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()
}
我的问题
解决方案
您需要编写结构以完全匹配 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
推荐阅读
- python - 我试图在列表的同一列中组合日期时间和字符串
- chronicle-map - 如果值是一个类,我在创建 ChronicleMap 时为平均值设置什么?[编年史-地图]
- django - AWS 中的 Django 登录
- php - Laravel - 使用范围
- powershell - 尝试使用 Remove-ADGroupMember 时,PowerShell 中的“从服务器返回了引用”
- python - 使用混合的 int 和字符串对列表进行排序
- c++ - 为 std::string 释放内存的异常(尝试在 UE4 中使用 YOLO/Darknet)
- python - 无头铬无法检测元素(硒)
- python - 如何在熊猫中将月份数转换为日期时间
- sql - 有没有办法代替 GROUP BY