"Данные не могут быть прочитаны, потому что они отсутствуют" при декодировании JSON в Swift
Я получаю следующую ошибку:
Данные не могут быть прочитаны, потому что они отсутствуют.
Когда я запускаю следующий код:
struct Indicator: Decodable {
let section: String
let key: Int
let indicator: Int
let threshold: Int
}
var indicators = [Indicator]()
do {
if let file = Bundle.main.url(forResource: "indicators", withExtension: "json") {
indicators = try JSONDecoder().decode([Indicator].self, from: try Data(contentsOf: file))
}
} catch {
print(error.localizedDescription)
}
Они находятся в функции, но я удалил их для ясности. У меня есть блок кода, который очень похож в другом файле (я скопировал этот код и существенно изменил имена), поэтому я не уверен, почему это происходит. Json файл действителен json и правильно настроен целевой объект.
Спасибо
Ответы
Ответ 1
Я только что решил аналогичную проблему на моем конце, но для декодера списка свойств.
Ошибка в этом случае означает, что ключ не найден, а не данные в целом.
Попробуйте сделать переменные в своей структуре необязательными, и он должен вернуть значение nil, где проблема.
Ответ 2
Попробуйте напечатать фактическую ошибку, а не просто описание. Он должен дать вам сообщение типа "No value associated with key someKey (\"actual_key_if_you_defined_your_own\")."
, которое гораздо более полезно, чем localizedDescription
.
Ответ 3
Печать error.localizedDescription
вводит в заблуждение, поскольку отображает только совершенно бессмысленное общее сообщение об ошибке.
Поэтому никогда не используйте localizedDescription
в Decodable
блоках перехвата.
В простой форме просто
print(error)
Он показывает полную ошибку, включая важную информацию debugDescription
и context
. Decodable
ошибки очень полны.
При разработке кода вы можете отлавливать каждую ошибку Decodable
отдельно, например
} catch let DecodingError.dataCorrupted(context) {
print(context)
} catch let DecodingError.keyNotFound(key, context) {
print("Key '\(key)' not found:", context.debugDescription)
print("codingPath:", context.codingPath)
} catch let DecodingError.valueNotFound(value, context) {
print("Value '\(value)' not found:", context.debugDescription)
print("codingPath:", context.codingPath)
} catch let DecodingError.typeMismatch(type, context) {
print("Type '\(type)' mismatch:", context.debugDescription)
print("codingPath:", context.codingPath)
} catch {
print("error: ", error)
}
Он показывает только самую значимую информацию.
Ответ 4
"Данные не могут быть прочитаны, потому что они отсутствуют"
ошибка, исходящая из этого кода:
...catch {
print(error.localizedDescription)
}
Потому что: кажется, что ключ отсутствует или опечатка.
Вы можете проверить, какой ключ отсутствует, написав следующее:
...catch {
debugPrint(error)
}
Примечание. Если ключи структуры отличаются от ключей данных JSON, см. Пример ниже: ключ в структуре - это "заголовок", а в данных - "имя".
struct Photo: Codable {
var title: String
var size: Size
enum CodingKeys: String, CodingKey
{
case title = "name"
case size
}
}
Если вы неправильно наберете "имя", появится сообщение об ошибке.
Кроме того, если вы неправильно наберете "CodingKeys", вы получите ошибку.
enum CodingKeys:...