您应该问自己的第一件事是您是否可以修复该服务器,以便它发送更合理的 JSON。在返回的数据不理想且无法控制结果格式的系统中工作过,我知道有时这是不可能的。
如果您或同事编写了该代码,我强烈建议您修复它。
如果由于无法控制服务器而无法修复服务器以发送更好的 JSON,则需要编写一些丑陋的代码来获取数据。
您可以从定义一个保存基本数据的结构开始。下面的代码 sn-ps 采取了一些捷径来简化答案。始终负责任地处理 nils 和 do-try-catch。
struct UserInfo: Codable {
let id: String
let name: String
}
然后你可以直接解码它:
let badContainer = try! JSONDecoder().decode([[String: UserInfo]].self, from: badJsonData)
然后访问您的数据:
let containerEntry = badContainer.first!
for (key, value) in containerEntry {
print("\(key): ID \(value.id) - NAME \(value.name)")
}
您现在可以完全访问您的数据,但我强烈建议您在核心级别解决此问题。这种类型的问题会在以后引起更多的麻烦。
我创建的完整游乐场附在下面:
let badJson =
"""
[{
"1": {
"id": "30",
"name": "Jhon"
},
"2": {
"id": "41",
"name": "Tim"
}
}]
"""
let badJsonData = badJson.data(using: .utf8)!
struct UserInfo: Codable {
let id: String
let name: String
}
let badContainer = try! JSONDecoder().decode([[String: UserInfo]].self, from: badJsonData)
let containerEntry = badContainer.first!
for (key, value) in containerEntry {
print("\(key): ID \(value.id) - NAME \(value.name)")
}