【发布时间】:2020-10-15 10:28:37
【问题描述】:
我是第一次使用 Swift,我希望能够将 API 响应中的一些信息处理成可用的 Swift 对象。
我有(例如)从我的 API 返回的以下数据:
{
data: [{
id: 1,
name: "Fred",
info: {
faveColor: "red",
faveShow: "Game of Thrones",
faveIceCream: "Chocolate",
faveSport: "Hockey",
},
age: "28",
location: "The Moon",
},{
...
}]
}
我很快就从 API 中返回了 data。我得到了第一个对象,我正在转换它并像这样访问它:
let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
let dataParentNode = json["data"] as! [[String:Any]]
let firstObject = dataParentNode[0]
let _id = firstObject["id"] as? String ?? "0"
let _name = firstObject["name"] as? String ?? "Unknown"
这很好,直到我想开始处理属于第一个对象的子对象,所以我想出了以下structs 来尝试使这个更干净。
请注意 - 我不需要处理所有返回的 JSON 数据,因此我想将其转换为结构中所需的内容
struct PersonInfo : Codable {
let faveColor: String?
let faveShow: String?
}
struct Person : Codable {
let id: String?
let name: String?
let info: PersonInfo?
}
当我接受这个时:
let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
let dataParentNode = json["data"] as! [[String:Any]]
let firstObject = dataParentNode[0]
然后尝试将firstObject 转换为Person 或firstObject["info"] 转换为PersonInfo 我似乎无法让它工作(我得到nil)。
let personInfo = firstObject["info"] as? PersonInfo
谁能给点建议?我只需要考虑获取 API 响应数据并将其映射到给定的结构(带有子对象),而忽略我不需要的键。
【问题讨论】:
-
let personInfo = firstObject as? PersonInfo,firstObject as? PersonInfo为 nil,因为firstObject不能作为 PersonInfo 移动,它充其量只是一个字典。let personInfo = PersonInfo(faveColor: firstObject["faveColor"] as? String ?? "Unknown color", faveShow: firstObject["faveColor"] as? String ?? "Unknown show") -
@Larme - 抱歉,这是一个错字。
firstObject是 JSON 中data数组中的第一个结果,因此它应该是:let personInfo = firstObject["info"] as? PersonInfo在我的 OP 中 -
let personInfoDict = firstObject["info"] as? [String: Any]和let personInfo = PersonInfo(faveColor: personInfoDict["faveColor"] as? String ?? "Unknown color", faveShow: personInfoDict["faveColor"] as? String ?? "Unknown show")