如何使用可编码协议为 swift 中的相同结构使用 2 个编码密钥
How to use 2 coding keys for same struct in swift using Codable Protocol
所以我在搜索我是否有我想在其上使用两个不同 API 的用户结构
struct User {
var firstName: String
}
第一个 API 有密钥 firstName
,第二个有密钥 first_Name
一个被忽视的方法是 custom keyDecodingStrategy
,但是这需要一个 dummy CodingKey
结构。
struct AnyKey: CodingKey {
var stringValue: String
var intValue: Int?
init?(stringValue: String) { self.stringValue = stringValue }
init?(intValue: Int) { self.stringValue = String(intValue) }
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .custom({
let currentKey = [=10=].last!
if currentKey.stringValue == "first_Name" {
return AnyKey(stringValue: "firstName")!
} else {
return currentKey
}
})
重点是使用自定义 decoder
而不是自定义键编码!
两者的结构将保持不变:
struct User: Codable {
let firstName: String
}
驼峰式案例
let firstJSON = #"{ "firstName": "Mojtaba" }"#.data(using: .utf8)!
let firstDecoder = JSONDecoder()
print(try! firstDecoder.decode(User.self, from: firstJSON))
Snace 案例示例
let secondJSON = #"{ "first_name": "Mojtaba" }"#.data(using: .utf8)!
let secondDecoder: JSONDecoder = {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
return decoder
}()
print(try! secondDecoder.decode(User.self, from: secondJSON))
此外,您可以实施自己的自定义策略。
因此决定每个 API 需要哪种解码器(或解码策略)。
所以我在搜索我是否有我想在其上使用两个不同 API 的用户结构
struct User {
var firstName: String
}
第一个 API 有密钥 firstName
,第二个有密钥 first_Name
一个被忽视的方法是 custom keyDecodingStrategy
,但是这需要一个 dummy CodingKey
结构。
struct AnyKey: CodingKey {
var stringValue: String
var intValue: Int?
init?(stringValue: String) { self.stringValue = stringValue }
init?(intValue: Int) { self.stringValue = String(intValue) }
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .custom({
let currentKey = [=10=].last!
if currentKey.stringValue == "first_Name" {
return AnyKey(stringValue: "firstName")!
} else {
return currentKey
}
})
重点是使用自定义 decoder
而不是自定义键编码!
两者的结构将保持不变:
struct User: Codable {
let firstName: String
}
驼峰式案例
let firstJSON = #"{ "firstName": "Mojtaba" }"#.data(using: .utf8)!
let firstDecoder = JSONDecoder()
print(try! firstDecoder.decode(User.self, from: firstJSON))
Snace 案例示例
let secondJSON = #"{ "first_name": "Mojtaba" }"#.data(using: .utf8)!
let secondDecoder: JSONDecoder = {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
return decoder
}()
print(try! secondDecoder.decode(User.self, from: secondJSON))
此外,您可以实施自己的自定义策略。
因此决定每个 API 需要哪种解码器(或解码策略)。