【问题标题】:Using KeyedDecodingContainer to decode an object with a random key使用 KeyedDecodingContainer 对具有随机密钥的对象进行解码
【发布时间】:2017-12-20 19:50:11
【问题描述】:

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

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 获取密钥,但不知道从哪里开始。希望在这里得到一些帮助。

谢谢!

【问题讨论】:

    标签: ios swift codable decodable


    【解决方案1】:

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


    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)
    }
    

    【讨论】:

    • 谢谢利奥。我已经更新了我的原始 json 以反映正确的结构。我错过的比我想象的要多……
    • @ZackShapiro 它不是一个数组,它是一个字典
    • 那句话中的“它”是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2019-09-28
    • 2016-08-15
    • 2021-11-29
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多