使用swift解析包含索引的json数据?
Posted
技术标签:
【中文标题】使用swift解析包含索引的json数据?【英文标题】:Parsing json data containing indexes using swift? 【发布时间】:2020-03-11 14:14:02 【问题描述】:如何快速解析这个 json 数据? 问题是它被索引了,这就是为什么我不怎么解析它。
[
"1":
"id": "30",
"name": "Jhon"
,
"2":
"id": "41",
"name": "Tim"
]
【问题讨论】:
几个问题。为什么 1 和 2 对象不直接在数组中?您是否只期望此 json 中有 2 个对象? 这能回答你的问题吗? Swift 4 parsing json numeric keys with 1+n amount 这不是一个容易处理的json格式。您不需要在 json 中包含“1”、“2” 【参考方案1】:试试
let res = try JSONDecoder().decode([[String:Root]].self, from: data)
struct Root: Codable
let id, name: String
如果可以的话
[
"id": "30",
"name": "Jhon"
,
"id": "41",
"name": "Tim"
]
那就做吧
let res = try JSONDecoder().decode[Root].self, from: data)
【讨论】:
这是我的json被索引的问题【参考方案2】:您应该问自己的第一件事是您是否可以修复该服务器,以便它发送更合理的 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)")
【讨论】:
以上是关于使用swift解析包含索引的json数据?的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 - 如何从包含字符串的索引中读取 json 输出