如何在尝试解码 JSON 时修复 Xcode 中的错误 "mismatch"
How to fix error "mismatch" in Xcode while trying to decode JSON
我是 Swift 语言的新手,我正在尝试在 Xcode.
中构建一个简单的 JSON 解析应用程序
这是我得到的一个错误: typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "Date", intValue: nil) ], debugDescription: “预期解码 Double 但发现了 string/data。”, underlyingError: nil))
这里有一个link要解析的:https://www.cbr-xml-daily.ru/daily_json.js
我有什么型号的:(我用https://app.quicktype.io创建的)
struct Welcome: Codable {
var date, previousDate: Date
var previousURL: String
var timestamp: Date
var valute: [String: Valute]
enum CodingKeys: String, CodingKey {
case date = "Date"
case previousDate = "PreviousDate"
case previousURL = "PreviousURL"
case timestamp = "Timestamp"
case valute = "Valute"
}
}
struct Valute: Codable {
var id, numCode, charCode: String
var nominal: Int
var name: String
var value, previous: Double
enum CodingKeys: String, CodingKey {
case id = "ID"
case numCode = "NumCode"
case charCode = "CharCode"
case nominal = "Nominal"
case name = "Name"
case value = "Value"
case previous = "Previous"
}
}
解析解码代码如下:
func request(urlString: String, completion: @escaping (Welcome?, Error?) -> Void) {
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
print("Some error")
completion(nil, error)
return
} else {
guard let data = data else { return }
do {
let welcome = try JSONDecoder().decode(Welcome.self, from: data)
completion(welcome, nil)
} catch let jsonError {
print("Failed to decode JSON: \(jsonError)")
completion(nil, jsonError)
}
}
} .resume()
}
非常感谢任何help/advice。
这是因为您没有正确解码 Date
。
尝试为您的 JSONDecoder
设置 dateDecodingStrategy
:
do {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let welcome = try decoder.decode(Welcome.self, from: data)
completion(welcome, nil)
} catch let jsonError {
print("Failed to decode JSON: \(jsonError)")
completion(nil, jsonError)
}
我是 Swift 语言的新手,我正在尝试在 Xcode.
中构建一个简单的 JSON 解析应用程序这是我得到的一个错误: typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "Date", intValue: nil) ], debugDescription: “预期解码 Double 但发现了 string/data。”, underlyingError: nil))
这里有一个link要解析的:https://www.cbr-xml-daily.ru/daily_json.js
我有什么型号的:(我用https://app.quicktype.io创建的)
struct Welcome: Codable {
var date, previousDate: Date
var previousURL: String
var timestamp: Date
var valute: [String: Valute]
enum CodingKeys: String, CodingKey {
case date = "Date"
case previousDate = "PreviousDate"
case previousURL = "PreviousURL"
case timestamp = "Timestamp"
case valute = "Valute"
}
}
struct Valute: Codable {
var id, numCode, charCode: String
var nominal: Int
var name: String
var value, previous: Double
enum CodingKeys: String, CodingKey {
case id = "ID"
case numCode = "NumCode"
case charCode = "CharCode"
case nominal = "Nominal"
case name = "Name"
case value = "Value"
case previous = "Previous"
}
}
解析解码代码如下:
func request(urlString: String, completion: @escaping (Welcome?, Error?) -> Void) {
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
print("Some error")
completion(nil, error)
return
} else {
guard let data = data else { return }
do {
let welcome = try JSONDecoder().decode(Welcome.self, from: data)
completion(welcome, nil)
} catch let jsonError {
print("Failed to decode JSON: \(jsonError)")
completion(nil, jsonError)
}
}
} .resume()
}
非常感谢任何help/advice。
这是因为您没有正确解码 Date
。
尝试为您的 JSONDecoder
设置 dateDecodingStrategy
:
do {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let welcome = try decoder.decode(Welcome.self, from: data)
completion(welcome, nil)
} catch let jsonError {
print("Failed to decode JSON: \(jsonError)")
completion(nil, jsonError)
}