Nic*_*rbo 3 json swift4 decodable swift4.1
我正在使用 Decodable 协议来解码一些 json,但我遇到了一个问题:
我得到了一个答案,其中经度和纬度可以是整数(纬度 = 0),如果没有添加到元素的地理位置数据,如果有地理数据,则可以是字符串(fx。纬度 =“25.047880”)可用的。现在,当我解码 json 时,我不知道如何构建我的 Struct,因为 long 和 lat 不能同时是 String 和 Int。
有关如何解决此问题的任何建议?我尝试使用“Any”作为数据类型,但这不符合可解码协议
struct JPhoto: Decodable {
let id: String
let farm: Int
let secret: String
let server: String
let owner: String
let title: String
let latitude: String //Can both be Int and String
let longitude: String //Can both be Int and String
}
Run Code Online (Sandbox Code Playgroud)
您需要编写自己的编码器/解码器。您可以使用关联的值枚举来执行此操作,使用 switch 语句进行编码并使用投掷/捕获行为进行解码:
enum AngularDistance:Codable {
case string(String), integer(Int)
func encode(to encoder: Encoder) throws {
switch self {
case .string(let str):
var container = encoder.singleValueContainer()
try container.encode(str)
case .integer(let int):
var container = encoder.singleValueContainer()
try container.encode(int)
}
}
init(from decoder: Decoder) throws {
do {
let container = try decoder.singleValueContainer()
let str = try container.decode(String.self)
self = AngularDistance.string(str)
}
catch {
do { let container = try decoder.singleValueContainer()
let int = try container.decode(Int.self)
self = AngularDistance.integer(int)
}
catch {
throw DecodingError.typeMismatch(AngularDistance.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Expected to decode an Int or a String"))
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是编码和解码此AngularDistance类型的示例:
let lat = [AngularDistance.string("String"), AngularDistance.integer(10)]
let encoder = JSONEncoder()
var decoder = JSONDecoder()
do {
let encoded = try encoder.encode(lat)
try decoder.decode(Array<AngularDistance>.self, from: encoded)
}
catch DecodingError.typeMismatch(let t, let e) {
t
e.codingPath
e.debugDescription
}
catch {
print(error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)
这是您重写的结构:
struct JPhoto: Decodable {
let id: String
let farm: Int
let secret: String
let server: String
let owner: String
let title: String
let latitude: AngularDistance //Can both be Int and String
let longitude: AngularDistance //Can both be Int and String
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
474 次 |
| 最近记录: |