Json 如果两种数据类型中的一种总是空的,那么如何在两种数据类型中解码可编码属性?
我收到一个post请求,这个JSON:Json 如果两种数据类型中的一种总是空的,那么如何在两种数据类型中解码可编码属性?,json,swift,swift4,decode,decodable,Json,Swift,Swift4,Decode,Decodable,我收到一个post请求,这个JSON: "clinic_info": { "city": "Querétaro", "state": "Querétaro", "country": "México", "phone": null, "ext": null, "coords": "20.6046089,-10
"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": []
这会产生一个错误:应该解码字典,但却找到了一个数组。发生这种情况是因为
decoder
想要Dictionary
,而您的JSON
是array
在解码之前需要检查JSON
响应是否为dictionary
或Array
,并相应地执行解码
如果你找到字典
,那么就这样做
let myData = try JSONDecoder().decode(YourModel.self, from: jsonData)
let myData = try JSONDecoder().decode([YourModel].self, from: jsonData)
如果您找到数组
,请执行以下操作
let myData = try JSONDecoder().decode(YourModel.self, from: jsonData)
let myData = try JSONDecoder().decode([YourModel].self, from: jsonData)
Array
类有一个用于此的方法
使用typeof
将始终返回“对象”
下面的代码显示了如何在Array
类中使用isArray()
方法
const obj = {
_array: [],
_object: {}
}
console.log(Array.isArray(obj._array)); // true
console.log(Array.isArray(obj._object)); // false
你可以像那样使用试试,扔
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{
}
提供这些JSON响应的服务将答复:
"clinic_info": { ... }
其中,…
是有效的JSON对象
但当它是空的,你说它看起来像这样:
"clinic_info": []
请注意,[]
表示这是一个空的对象数组
您可能希望更改服务响应(如果可能的话),因为在我看来,当它有有效数据时返回一个对象,当没有有效数据时返回一个数组,这看起来不一致
您收到的错误消息很清楚:
应解码字典,但找到了数组
它需要一个对象{}
,但找到了一个数组[]
@Christian4423:谢谢,已更新