我从post请求中收到这个JSON:
"clinic_info": {
"city": "Querétaro",
"state": "Querétaro",
"country": "México",
"phone": null,
"ext": null,
"coords": "20.6046089,-100.37826050000001",
"location": "Querétaro"
}但是当它为空时,JSON是:
"clinic_info": []这会产生一个错误:期望对Dictionary进行解码,但找到了一个数组。
发布于 2018-05-09 04:07:51
这是因为decoder想要dictionary,而您的JSON是array
需要在decoding之前检查JSON响应是dictionary还是Array,并相应地执行decoding。
如果你找到了Dictionary,你可以这样做
let myData = try JSONDecoder().decode(YourModel.self, from: jsonData)如果你找到了Array,你可以这样做
let myData = try JSONDecoder().decode([YourModel].self, from: jsonData)发布于 2018-05-09 04:10:45
Array类有一个用于此目的的方法。
使用typeof将始终返回"object"。
下面的代码显示了如何在Array类中使用isArray()方法。
const obj = {
_array: [],
_object: {}
}
console.log(Array.isArray(obj._array)); // true
console.log(Array.isArray(obj._object)); // false发布于 2018-05-09 04:13:03
您可以像这样使用try, throw来完成此操作
import Foundation
struct ClinicData: Codable {
let clinicInfo: ClinicInfo?
enum CodingKeys: String, CodingKey {
case clinicInfo = "clinic_info"
}
}
struct ClinicInfo: Codable {
let city, state, country: String
let coords, location: String
}
// MARK: Convenience initializers
extension ClinicData {
init(data: Data) throws {
self = try JSONDecoder().decode(ClinicData.self, from: data)
}
init(_ json: String, using encoding: String.Encoding = .utf8) throws {
guard let data = json.data(using: encoding) else {
throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
}
try self.init(data: data)
}
func jsonData() throws -> Data {
return try JSONEncoder().encode(self)
}
func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
return String(data: try self.jsonData(), encoding: encoding)
}
}
**get clinicInfo**
if let clinicData = try? ClinicData.init(data: Data()), let clinicInfo =
clinicData.clinicInfo{
}https://stackoverflow.com/questions/50241468
复制相似问题