我有以下简单的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来解析字典中的结果,所有这些都带有字符串?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在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字符串的复杂性。