我收到了一个帖子请求,这个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": []
这会产生错误:预计解码字典但会找到一个数组。
答案 0 :(得分:2)
这种情况正在发生,因为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)
答案 1 :(得分:0)
Array
类有一个方法。
使用typeof
将始终返回"object"
。
下面的代码显示了如何在isArray()
类中使用Array
方法。
const obj = {
_array: [],
_object: {}
}
console.log(Array.isArray(obj._array)); // true
console.log(Array.isArray(obj._object)); // false
答案 2 :(得分:0)
您可以使用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{
}
答案 3 :(得分:0)
提供这些JSON响应的服务回复:
"clinic_info": { ... }
...
是有效的JSON对象。
但是当它是空的时,你说它看起来像这样:
"clinic_info": []
请注意,[]
表示这是一个空的对象数组。
你可能想要更改服务响应(如果可能的话),因为它看起来不一致让它在有有效数据时返回一个对象,而在没有有效数据时返回一个数组。
您收到的错误消息很明确:
预计解码字典但会找到一个数组。
它期望一个对象{}
,但找到了一个数组[]
。