使用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 解析 JSON

Swift 3 - 如何从包含字符串的索引中读取 json 输出

在 Swift 3 中解析 JSON,就像 Apple 的 Swift 2 示例一样

JSON 数组 Swift 的索引

(Swift)如何解析有时包含某个字段的 JSON 响应?

在 Swift 问题中为 iOS 应用程序解析 JSON