Swift Json 响应解码
Posted
技术标签:
【中文标题】Swift Json 响应解码【英文标题】:Swift Json Response Decoding 【发布时间】:2018-12-31 21:58:30 【问题描述】:试图解码来自 https 调用的 json 响应。 正在解码的代码:
if let data = responseData, let _ = String(data: data, encoding: .utf8)
if let httpResponse = response as? HTTPURLResponse
if httpResponse.statusCode == 401
print("Not Authorized")
else if httpResponse.statusCode == 200
let decoder = JSONDecoder()
let model: [ListResponse] = try! decoder.decode([ListResponse].self, from: data)
print("Model: \(model)")
它只是不断输出一个空数组。我显然错过了什么有人可以帮忙吗?我可以使用从 Swift 传递的相同信息从 PostMan 调用 api 的方法,并返回我的值。由于某种原因,返回 json 的解析失败且没有错误。
编辑: 响应数据:
[
"id": 1,
"numb": "12345",
"bName": "Test Tester",
"clDate": "2018-12-31T00:00:00",
"currSt": "OK",
"proPerc": 10,
"prop": "TBD"
,
"id": 2,
"numb": "123456",
"bName": "Test Tester2",
"clDate": "2018-12-31T00:00:00",
"currSt": "OK",
"proPerc": 20,
"prop": "TBD"
]
归结为从上面解析 clDate 的问题。只有在我将 json 转换为字符串并尝试解析时才发现该错误。现在正在尝试弄清楚如何处理日期 json 解析。
【问题讨论】:
数据从何而来?你的代码看起来不错。如果模型是一个空数组,你应该查看你的后端服务。 抱歉,我添加了一个可以解释这一点的编辑。它来自一个 API。我可以从 postman 调用相同的方法,它返回的值与传递的参数相同。 请发布一些您使用邮递员获得的示例数据 让 json = try JSON(data: data);打印(json);可以打印数据吗?如果数据为空,您可以查看数据。 所以,不完全确定这是否与您的要求相同。您要求的是向我抛出编译器错误,所以我这样做了:让 JSON = 尝试! JSONSerialization.jsonObject(with: data, options: []) print("Json: (JSON)") 返回一个空白输出 【参考方案1】:把下面的东西放在操场上。下次你必须做这种事情时,记住 Playgrounds 是你的朋友:
struct ListResponse: Decodable
let id: Int
let numb: String
let bName: String
let clDate: Date
let currSt: String
let proPerc: Int
let prop: String
let myDateFormatter: DateFormatter =
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
return formatter
()
let text =
"""
[
"id": 1,
"numb": "12345",
"bName": "Test Tester",
"clDate": "2018-12-31T00:00:00",
"currSt": "OK",
"proPerc": 10,
"prop": "TBD"
,
"id": 2,
"numb": "123456",
"bName": "Test Tester2",
"clDate": "2018-12-31T00:00:00",
"currSt": "OK",
"proPerc": 20,
"prop": "TBD"
]
"""
let data = text.data(using: .utf8)!
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(myDateFormatter)
let model: [ListResponse] = try! decoder.decode([ListResponse].self, from: data)
print("Model: \(model)")
【讨论】:
clDate 必须是一个字符串才能工作吗?从技术上讲,它是来自 api 的 DateTime 数据类型。 我更新以说明日期。 Playground 不仅是您的朋友,Google 也是:useyourloaf.com/blog/swift-codable-with-custom-dates以上是关于Swift Json 响应解码的主要内容,如果未能解决你的问题,请参考以下文章
将 JSON 数据从 Parse Cloud Code 返回到 Swift 中的可解码结构