【发布时间】:2020-08-27 00:06:10
【问题描述】:
这是我的 json 我正在尝试使用 JSONDecoder 进行解码,但由于无法做到这一点而遇到了困难。有人可以帮助我了解什么结构以及如何解码?
{
"Afghanistan": [
{
"city": "Kabul",
"lat": "34.5167",
"lng": "69.1833",
"state": "Kābul",
"country": "Afghanistan"
},
{
"city": "Karukh",
"lat": "34.4868",
"lng": "62.5918",
"state": "Herāt",
"country": "Afghanistan"
},
{
"city": "Zarghūn Shahr",
"lat": "32.85",
"lng": "68.4167",
"state": "Paktīkā",
"country": "Afghanistan"
}
],
"Albania": [
{
"city": "Tirana",
"lat": "41.3275",
"lng": "19.8189",
"state": "Tiranë",
"country": "Albania"
},
{
"city": "Pukë",
"lat": "42.0333",
"lng": "19.8833",
"state": "Shkodër",
"country": "Albania"
}
]}
你建议如何解码?
我正在尝试这个
let locationData: Countries = load("Countries.json")
func load<T: Decodable>(_ filename: String) -> T {
let data: Data
guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
else {
fatalError("Couldn't find \(filename) in main bundle.")
}
do {
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}
struct Country: Codable, Identifiable {
var id = UUID()
let city, lat, lng: String
let state: String?
let country: String
}
typealias Countries = [String: [Country]]
但出现此错误
无法将 Country.json 解析为 Dictionary>: keyNotFound(CodingKeys(stringValue: "id", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "阿尔巴尼亚", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "没有与键关联的值 CodingKeys(stringValue: \"id\", intValue: nil) (\"id\").", 基础错误:无)):
【问题讨论】:
-
与您的问题无关,但抛出
fatalError通常是个坏主意,尤其是在do-catch的catch 块中。如果你真的无法从try抛出的错误中恢复,你应该简单地使用try!。但是,在大多数情况下,这也是一个坏主意,因为如果为用户执行了catch块,应用程序将简单地崩溃而不会收到错误消息。最好使用assertionFailures而不是fatalErrora,这样您可以在开发过程中及早发现错误,但用户不会遇到崩溃,而是向他们显示一般错误消息。