gpt4 book ai didi

ios - 在 Swift 中使用 Codable 将具有不同键的 JSON 解析为同一对象

转载 作者:行者123 更新时间:2023-12-04 02:29:15 26 4
gpt4 key购买 nike

我从不同的 API 收到以下 2 个响应

{
"id": "jdu72bdj",
"userInfo": {
"name": "Sudhanshu",
"age": 28,
"country": "India"
}
}

{
"profileId": "jdu72bdj",
"profileDetails": {
"name": "Sudhanshu",
"age": 28,
"country": "India"
}
}

这与使用 Swift 语言的 iOS 开发 相关。基本上对象结构相同,但键不同。我正在使用 Codable 解析它们,但我想不出一种使用相同结构进行解析的方法。我能想到的就是像这样制作 2 个不同的结构 -

public struct Container1: Codable {
public let id: String
public let userInfo: UserProfile?
}

public struct Container2: Codable {
public let profileId: String
public let profileDetails: UserProfile?
}

它们都使用通用的 UserProfile 结构。

public struct UserProfile: Codable {
public let name: String?
public let age: Int?
public let country: String?
}

有没有办法对解析来自 2 个不同键的响应的两个响应使用一个公共(public)容器结构。我不想要 Container1 和 Container2,因为它们都具有相同的结构。

有什么建议吗?

最佳答案

一种解决方案是使用自定义 key 解码策略,使用在 Apple 的 documentation 中找到的 CodingKey 的实现。 .这个想法是将两个 json 消息的键映射到将用于两个消息的结构容器的属性。

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .custom({ keys in
let key = keys.last!.stringValue
switch key {
case "id", "profileId":
return AnyKey(stringValue: "id")!
case "userInfo", "profileDetails":
return AnyKey(stringValue: "details")!
default:
return keys.last!
}
})

CodingKey 的自定义实现在哪里

struct AnyKey: CodingKey {
var stringValue: String
var intValue: Int?

init?(stringValue: String) {
print(stringValue)
self.stringValue = stringValue
intValue = nil
}

init?(intValue: Int) {
self.stringValue = String(intValue)
self.intValue = intValue
}
}

然后使用下面的结构以相同的方式解码两个 json 消息

struct Container: Codable {
let id: String
let details: UserProfile
}

let result = try decoder.decode(Container.self, from: data)

关于ios - 在 Swift 中使用 Codable 将具有不同键的 JSON 解析为同一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65290531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com