gpt4 book ai didi

ios - Codable 对象映射数组元素到字符串

转载 作者:行者123 更新时间:2023-11-28 12:14:07 27 4
gpt4 key购买 nike

我有一个(恼人的)情况,我的后端返回一个像这样的对象:

{
"user": {
"name": [
"John"
],
"familyName": [
"Johnson"
]
}
}

其中每个属性都是一个数组,其中包含一个字符串作为其第一个元素。在我的数据模型 struct 中,我可以将每个属性声明为一个数组,但这确实很难看。我想要这样的模型:

struct User: Codable {
var user: String
var familyName: String
}

但这当然会使编码/解码失败,因为类型不匹配。到目前为止,我一直在使用 ObjectMapper 库,它提供了一个 Map 对象和 currentValue 属性,这样我就可以将我的属性声明为 String 键入并在我的模型 init 方法中通过此函数分配每个值:

extension Map {
public func firstFromArray<T>(key: String) -> T? {
if let array = self[key].currentValue as? [T] {
return array.first
}
return self[key].currentValue as? T
}
}

但现在我正在转换为 Codable 方法,我不知道如何进行这种映射。有什么想法吗?

最佳答案

你可以覆盖init(from decoder: Decoder):

let json = """
{
"user": {
"name": [
"John"
],
"familyName": [
"Johnson"
]
}
}
"""

struct User: Codable {
var name: String
var familyName: String

init(from decoder: Decoder) throws {
let container:KeyedDecodingContainer = try decoder.container(keyedBy: CodingKeys.self)
let nameArray = try container.decode([String].self, forKey: .name)
let familyNameArray = try container.decode([String].self, forKey: .familyName)
self.name = nameArray.first!
self.familyName = familyNameArray.first!
}

enum CodingKeys: String, CodingKey {
case name
case familyName
}
}

let data = json.data(using: .utf8)!
let decodedDictionary = try JSONDecoder().decode(Dictionary<String, User>.self, from: data)
print(decodedDictionary) // ["user": __lldb_expr_48.User(name: "John", familyName: "Johnson")]

let encodedData = try JSONEncoder().encode(decodedDictionary["user"]!)
let encodedStr = String(data: encodedData, encoding: .utf8)
print(encodedStr!) // {"name":"John","familyName":"Johnson"}

关于ios - Codable 对象映射数组元素到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47419291/

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