Ios 使用KeyedDecodingContainer对具有随机密钥的对象进行解码

Ios 使用KeyedDecodingContainer对具有随机密钥的对象进行解码,ios,swift,codable,decodable,Ios,Swift,Codable,Decodable,我有一个像这样的对象数组,我想解码 let accountPending = """ { "blocks": { "F143CCC051927EEF59EEA78D16D80F855052BBF159EA6602843904C9445": { "amount": "10000000000000000000000000000000", "source": "6xswkroybxydyzaxybb1h531sx34omiu7an

我有一个像这样的对象数组,我想解码

let accountPending = """
{
    "blocks": {
        "F143CCC051927EEF59EEA78D16D80F855052BBF159EA6602843904C9445": {
            "amount": "10000000000000000000000000000000",
            "source": "6xswkroybxydyzaxybb1h531sx34omiu7an9t9jy19f9mca7a36s7by5e"
        },
    }
}
""".data(using: .utf8)!
所以我试着沿着这些思路做些事情

struct PendingBlock: Decodable {

let work: [String: PendingBlockData]

enum CodingKeys: String, CodingKey {
    case work = "???"
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)

    self.work = try container.decode(Dictionary.self, forKey: .work)
}

struct PendingBlockData: Decodable {
    let amount: String
    let source: String
}
显然这是行不通的,因为
work
的字符串大小写不是实际值。一位朋友建议使用
KeyedDecodingContainer
获取密钥,但不确定从何处开始。我想在这里得到一些帮助


谢谢

您只需将定义字典值结构传递为可解码,并使用字符串作为字典的键:





谢谢你,利奥。我已经更新了我的原始json以反映正确的结构。我错过的比我想象的要多…@ZackShapiro这不是数组,而是字典那句话中的“it”是什么?
let json = """
{
  "blocks": {
    "F143CCC051927EEF59EEA78D16D80F855052BBF159EA6602843904C9445": {
      "amount": "10000000000000000000000000000000",
      "source": "6xswkroybxydyzaxybb1h531sx34omiu7an9t9jy19f9mca7a36s7by5e"
    }
  }
}
"""
let data = Data(json.utf8)
struct Root: Decodable {
    let blocks: [String:Block]
}
struct Block: Decodable {
    let amount: String
    let source: String
}
do {
    let blocks = try JSONDecoder().decode(Root.self, from: data).blocks
    for (key, value) in blocks {
        print(key, value)   // "F143CCC051927EEF59EEA78D16D80F855052BBF159EA6602843904C9445 Block(amount: "10000000000000000000000000000000", source: "6xswkroybxydyzaxybb1h531sx34omiu7an9t9jy19f9mca7a36s7by5e")\n"
    }
} catch {
    print(error)
}