swift - 带有可编码返回数组的 Swift Rest API 调用
问题描述
这是关于这个问题的进一步链接 Swift Rest API call example using Codable
当我更改代码以处理数组时,我收到 JSON 错误。这就是我正在做的事情。我究竟做错了什么?它与“json 错误”出错。
// Transaction Class
import Foundation
final class Transaction: Codable {
var id: Int?
var date: Date
var amount: Int
var planeID: Int
var userID: UUID
var month: Int
var year: Int
init(date: Date, amount: Int, planeID: Int, userID: UUID, month: Int, year: Int) {
self.date = date
self.amount = amount
self.planeID = planeID
self.userID = userID
self.month = month
self.year = year
}
}
// Call in my ViewController
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
getJson() { (json) in
print(json.count)
//print(json[0].note)
print(json)
}
}
func getJson(completion: @escaping ([Transaction])-> ()) {
let urlString = "http://192.168.1.98:8080/admin/transactions"
if let url = URL(string: urlString) {
URLSession.shared.dataTask(with: url) {data, res, err in
guard let data = data else {return print("error with data")}
let decoder = JSONDecoder()
guard let json = try? decoder.decode([Transaction].self, from: data) else {return print("error with json")}
completion(json)
}.resume()
}
}
}
这是我调用 Rested 时的 JSON 响应正文
//Form of the JSON response body when I used call via Rested
[
{
"amount": 1000,
"userID": "7698E011-6643-421E-A30D-121FF488FDBB",
"id": 2,
"month": 5,
"date": "2021-01-14T20:30:31Z",
"year": 2021,
"planeID": 1
},
{
"amount": 1000,
"userID": "7698E011-6643-421E-A30D-121FF488FDBB",
"id": 3,
"month": 5,
"date": "2021-01-14T20:30:31Z",
"year": 2021,
"planeID": 2
},
{
"amount": 1000,
"userID": "7698E011-6643-421E-A30D-121FF488FDBB",
"id": 4,
"month": 5,
"date": "2021-01-14T20:30:31Z",
"year": 2021,
"planeID": 2
},
{
"amount": 1000,
"userID": "7698E011-6643-421E-A30D-121FF488FDBB",
"id": 5,
"month": 5,
"date": "2021-01-14T20:30:31Z",
"year": 2021,
"planeID": 2
},
{
"amount": 1000,
"userID": "7698E011-6643-421E-A30D-121FF488FDBB",
"id": 6,
"month": 5,
"date": "2021-01-14T20:30:31Z",
"year": 2021,
"planeID": 2
}
]
解决方案
如果您使用try
/并打印错误,您会看到在解码属性catch
时发生错误。date
(如评论中所述,不要隐藏错误try?
- 你不会知道出了什么问题)
要将日期正确解码为Date
,您需要在解码器上设置日期解码策略。在您的情况下,日期似乎是标准 ISO8601,它是JSONDecoder
. 因此,您只需添加一行:
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601 // <-- ADD THIS
// use do/try/catch with decoding
do {
let transactions = try decoder.decode([Transaction].self, from: data)
completion(transactions)
} catch {
print(error) // or handle it somehow
}
推荐阅读
- docker - .net core - 使用 docker compose 构建错误
- python - 使用 BeautifulSoup 的 div 后的文本 - .next_sibling 不起作用
- excel - Excel/vba:如果出错,如何跳到下一张?
- python - Python函数来添加或减去数字的数字
- node.js - 如何为具有大量文件的项目实现基于 LSP 的“转到定义”类型的功能?
- python-3.x - 导入 seaborn 时出现此错误
- python - 在 Kivy 中舍入备用边缘
- python - auth.user.none 和
在 ManyToManyField 渲染中 - c++ - 标准::对
返回类型 - c# - 鼠标悬停时按钮的背景闪烁或消失