开发者社区 问答 正文

如何使用可编码的方式解码字典的JSON字典(有不同的键)?

我有以下简单的JSON:

{
    "201" :
    {
        "contryName" : "Albania",
        "countryCode" : "AL"
    },
    "202" :
    {
        "contryName" : "Andorra",
        "countryCode" : "AD"
    },
    ...
}

内部字典简单地变成:

struct Mid : Codable
{
    var contryName: String
    var countryCode: String
}

但后来我被困住了。我如何表示外部字典?

我想得到一本字典Mid对象String钥匙"201", "202", ...

这有可能吗Codable或者我应该回到旧的JSON来解析字典中的结果,所有这些都带有字符串?

展开
收起
游客5akardh5cojhg 2019-12-14 17:56:16 457 分享 版权
阿里云 AI 助理回答

在Swift中,要表示外部字典,你可以创建一个自定义的容器类型来处理这种动态键的情况。这里是一个例子,展示了如何使用Codable来解析你提供的JSON结构:

首先,保持你的Mid结构体不变,它已经很好地定义了内部对象的结构:

struct Mid: Codable {
    let contryName: String // 注意拼写错误,应为 "countryName"
    let countryCode: String
}

然后,创建一个新的结构体或类来表示整个JSON数据,并实现Codable协议。由于外部键是不确定的,我们可以利用Swift的字典类型[String: Mid]来存储这些值:

struct CountryData: Codable {
    private enum CodingKeys: String, CodingKey {
        case countries // 这个key可以自定义,用于整个数据集
    }
    
    var countries: [String: Mid]
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let countriesContainer = try container.nestedContainer(keyedBy: String.self, forKey: .countries)
        
        var countriesDict = [String: Mid]()
        for key in countriesContainer.allKeys {
            if let mid = try? countriesContainer.decode(Mid.self, forKey: key) {
                countriesDict[key] = mid
            }
        }
        self.countries = countriesDict
    }
    
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        var nestedContainer = container.nestedContainer(keyedBy: String.self, forKey: .countries)
        
        for (key, value) in countries {
            try nestedContainer.encode(value, forKey: key)
        }
    }
}

这样,CountryData结构体就能够解析和编码具有动态字符串键的Mid对象字典了。你可以像下面这样使用它来解析你的JSON数据:

do {
    let jsonData = // 从API、文件等获取的JSON数据
    let decoder = JSONDecoder()
    let countryData = try decoder.decode(CountryData.self, from: jsonData)
    print(countryData.countries) // 输出已解码的字典
} catch {
    print("解码失败:", error)
}

这个解决方案完全基于Swift的Codable协议,避免了手动解析JSON字符串的复杂性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答