使用Swift解析包含索引的JSON数据?

时间:2020-03-11 14:14:02

标签: json swift

如何快速解析此json数据? 问题在于它已建立索引,这就是为什么我不解析它的原因。

[{
    "1": {
        "id": "30",
        "name": "Jhon"
    },
    "2": {
        "id": "41",
        "name": "Tim"
    }
}]

2 个答案:

答案 0 :(得分:0)

尝试

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)

答案 1 :(得分:0)

您应该问自己的第一件事是,是否可以修复该服务器,以便它发送回更合理的JSON。在返回的数据少于期望的数据并且对结果格式没有任何控制的系统中工作后,我知道有时是不可能的。

如果您或同事编写了该代码,强烈建议您对其进行修复。

如果由于无法控制而无法固定服务器来发送更好的JSON,则需要编写一些难看的代码来获取数据。

您可以先定义一个用于保存基本数据的结构。以下代码段采用了一些快捷方式来简化答案。始终以负责任的态度对待nil并进行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)")
}
相关问题