在 Decodable class | 中为 属性 设置一个 Alter 名称Swift
Set an Alter name for property in Decodable class | Swift
我正在为 IOS Swift UI.
开发现有的 Android Kotlin 应用程序
在 Kotlin 中使用 Gson 时,我有一个客户端模型 class:
abstract class Client(
@SerializedName("nombre")
var name: String? = null,
@SerializedName(value="cliente_id", alternate = ["id"])
var client_id: Int = -1,
)
如您所见,我使用 @SerializedName()
给客户 属性 name
或 client_id
一个别名。我这样做是因为当我从 API 获取数据时,客户端 Json 具有“nombre”而不是我想要的“name”。因此 @SerializedName()
可以将 JSON 中的“nombre”检测为“name”或将“cliente_id”检测为 Kotlin 模型 类 中的“client_id”。这样我就可以使用我自己的 属性 名称从 API 读取数据。
好吧,现在我在 Swift 中遇到了同样的问题。我想使用自己的 属性 名称,而不是 API JSON 属性 名称。
我的 swift 客户端模型 class 如下所示:
class Client: Identifiable, Decodable{
init(id: Int, token: String) {
self.cliente_id = id
self.token = token
}
let cliente_id: Int
let token: String
}
然后我从 API 中获取客户数据,如下所示:
let request = AF.request(
url, method: .post,
parameters: parameters,
encoder: JSONParameterEncoder.default
)
request.validate(statusCode: 200...299)
request.responseDecodable(of: Client.self) { response in
if let loginResponse = response.value{//Success
loginPublisher.send(loginResponse)
}
else{//Failure
loginPublisher.send(completion: Subscribers.Completion<NetworkError>.failure(.thingsJustHappen))
}
}
为了能够使用 Client
可解码,Client
必须实施 Decodable
。好吧,我想要的只是客户有 id
而不是 cliente_id
作为 属性 名称。
类似
class Client: Identifiable, Decodable{
init(id: Int, token: String) {
self.id = id
self.token = token
}
@NameforDecode("cliente_id")
let id: Int
let token: String
}
这可能吗?
在 Swift 中,您可以通过自定义类型来实现此目的 CodingKeys
:
extension Client: Decodable {
enum CodingKeys: String, CodingKey {
case id = "cliente_id"
case token
}
}
枚举案例必须与您的属性相对应;如果 JSON 中的键与您的 属性 名称不匹配,则可以将原始值声明为 String
。 Encoding and Decoding Custom Types 开发者文章中有更多信息。
我正在为 IOS Swift UI.
开发现有的 Android Kotlin 应用程序在 Kotlin 中使用 Gson 时,我有一个客户端模型 class:
abstract class Client(
@SerializedName("nombre")
var name: String? = null,
@SerializedName(value="cliente_id", alternate = ["id"])
var client_id: Int = -1,
)
如您所见,我使用 @SerializedName()
给客户 属性 name
或 client_id
一个别名。我这样做是因为当我从 API 获取数据时,客户端 Json 具有“nombre”而不是我想要的“name”。因此 @SerializedName()
可以将 JSON 中的“nombre”检测为“name”或将“cliente_id”检测为 Kotlin 模型 类 中的“client_id”。这样我就可以使用我自己的 属性 名称从 API 读取数据。
好吧,现在我在 Swift 中遇到了同样的问题。我想使用自己的 属性 名称,而不是 API JSON 属性 名称。
我的 swift 客户端模型 class 如下所示:
class Client: Identifiable, Decodable{
init(id: Int, token: String) {
self.cliente_id = id
self.token = token
}
let cliente_id: Int
let token: String
}
然后我从 API 中获取客户数据,如下所示:
let request = AF.request(
url, method: .post,
parameters: parameters,
encoder: JSONParameterEncoder.default
)
request.validate(statusCode: 200...299)
request.responseDecodable(of: Client.self) { response in
if let loginResponse = response.value{//Success
loginPublisher.send(loginResponse)
}
else{//Failure
loginPublisher.send(completion: Subscribers.Completion<NetworkError>.failure(.thingsJustHappen))
}
}
为了能够使用 Client
可解码,Client
必须实施 Decodable
。好吧,我想要的只是客户有 id
而不是 cliente_id
作为 属性 名称。
类似
class Client: Identifiable, Decodable{
init(id: Int, token: String) {
self.id = id
self.token = token
}
@NameforDecode("cliente_id")
let id: Int
let token: String
}
这可能吗?
在 Swift 中,您可以通过自定义类型来实现此目的 CodingKeys
:
extension Client: Decodable {
enum CodingKeys: String, CodingKey {
case id = "cliente_id"
case token
}
}
枚举案例必须与您的属性相对应;如果 JSON 中的键与您的 属性 名称不匹配,则可以将原始值声明为 String
。 Encoding and Decoding Custom Types 开发者文章中有更多信息。