【问题标题】:Parsing json data containing indexes using swift?使用swift解析包含索引的json数据?
【发布时间】: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”

标签: json swift


【解决方案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)")
}

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多