【问题标题】:Swift 4 codable: the keys are Int array in JSON dataSwift 4 可编码:键是 JSON 数据中的 Int 数组
【发布时间】:2018-06-15 21:45:18
【问题描述】:
{
  "0": {
    "name": "legaldoc.pdf",
    "cmisid": "yib5C-w92PPtxTBlXl4UJ8oDBthDtAU9mKN5kh2_KrQ"
  },
  "1": {
    "name": "persdoc.pdf",
    "cmisid": "dqAnrdNMXGTz1RbOMI37OY6tH9xMdxiTnz6wEl2m-VE"
  },
  "2": {
    "name": "certdoc.pdf",
    "cmisid": "6d7DuhldQlnb0JSjXlZb9mMOjxV3E_ID-ynJ0QRPMOA"
  }
}

如何使用 Swift 4 Codable 解析 JSON 数据?问题是键是 Int 数组。 如何为此设置 CodingKeys?

【问题讨论】:

  • 为什么说键是Int 数组?您发布的 JSON 中没有任何类型的数组。
  • 请看键[0, 1, 2, 3],那些JSON数据是从数据库返回的。因为这个数据库不像 Firebase 数据库那样支持 JSON 中的数组,所以它会像 Int 数组一样自动为每个元素添加一个 Int 键。
  • 同样,您发布的 JSON 中没有数组。您问题中的 JSON 是一个包含键和值的字典,这些值是另一个字典。没有数组。
  • 当键是数字和顺序时,我如何通过可编码来解析这个?

标签: json swift int swift4 codable


【解决方案1】:

如 cmets 中所述,没有数组。所有集合类型都是字典。

您可以将其解码为 Swift 字典。要获取数组,将结果映射到排序键的值

let jsonString = """
{
    "0": {
        "name": "legaldoc.pdf",
        "cmisid": "yib5C-w92PPtxTBlXl4UJ8oDBthDtAU9mKN5kh2_KrQ"
    },
    "1": {
        "name": "persdoc.pdf",
        "cmisid": "dqAnrdNMXGTz1RbOMI37OY6tH9xMdxiTnz6wEl2m-VE"
    },
    "2": {
        "name": "certdoc.pdf",
        "cmisid": "6d7DuhldQlnb0JSjXlZb9mMOjxV3E_ID-ynJ0QRPMOA"
    }
}
"""

struct Item : Codable {
    let name, cmisid : String
}

do {
    let data = Data(jsonString.utf8)
    let result = try JSONDecoder().decode([String: Item].self, from: data)
    let keys = result.keys.sorted()
    let array = keys.map{ result[$0]! }
    print(array)

} catch {
    print(error)
}

【讨论】:

  • 感谢您的解决方案,让我知道 swift 字典也符合 CODABLE 协议。我之所以在cmets中提到Int数组,是因为数据类型在数据库数组中。当数据库返回 JSON 时,必须添加键(int 和 sequent)。所以 Array 变成 JSON 文件中的字典。有没有办法在 Codable Init 方法中添加一些方法,可以在 Codable 解码期间将字典传输到数组?或者将一个 Int 数组设置为 CodingKeys for "0" "1" "2"
  • 当然你可以写一个自定义的初始化器但是不可能使用CodingKeys来解码任意字典键。预期的结果是什么?
  • 预期结果与您的示例相同,只需将方法移至将字典转换为数组的自定义初始化程序即可。谢谢!
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 2019-08-05
相关资源
最近更新 更多