Je reçois l'erreur suivante :
Les données n'ont pas pu être lues car elles sont manquantes.
Lorsque j'exécute le code suivant:
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)
}
Ce sont dans une fonction, mais je les ai supprimés pour plus de clarté. J'ai un bloc de code qui est très similaire dans un fichier différent (j'ai copié ce code à partir de là et changé les noms essentiellement), donc je ne sais pas pourquoi cela se produit. Le fichier json est json valide et sa cible est correctement définie.
Merci
Je viens de résoudre un problème similaire de mon côté, mais pour le décodeur de liste de propriétés.
L'erreur dans ce cas semble signifier qu'une clé n'a pas été trouvée et non les données dans leur ensemble.
Essayez de rendre les variables de votre structure facultatives et il devrait retourner une valeur nulle là où se situe le problème.
Essayez d'imprimer l'erreur réelle au lieu de simplement la description. Il devrait vous donner un message comme "No value associated with key someKey (\"actual_key_if_you_defined_your_own\")."
, qui est beaucoup plus utile que localizedDescription
.
Impression error.localizedDescription
est trompeur car il n'affiche qu'un message d'erreur générique tout à fait dénué de sens.
Donc n'utilisez jamais localizedDescription
dans Decodable
blocs catch.
Sous la forme simple juste
print(error)
Il montre l'erreur complète, y compris les informations cruciales debugDescription
et context
.Decodable
les erreurs sont très complètes.
Lors du développement du code, vous pouvez intercepter chaque erreur Decodable
séparément par exemple
} 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)
}
Il ne montre que les informations les plus importantes.
"Les données n'ont pas pu être lues car elles sont manquantes"
l'erreur provenant de ce code:
...catch {
print(error.localizedDescription)
}
Parce que: semble qu'une clé est manquante ou mal tapée.
Vous pouvez vérifier quelle clé manque en codant comme ceci:
...catch {
debugPrint(error)
}
Remarque: Si les clés de structure sont différentes des clés de données JSON, voir l'exemple ci-dessous: la clé dans struct est 'title' mais dans les données est 'name'.
struct Photo: Codable {
var title: String
var size: Size
enum CodingKeys: String, CodingKey
{
case title = "name"
case size
}
}
Si vous saisissez mal 'nom', l'erreur apparaîtra.
De plus, si vous tapez mal ce 'CodingKeys', vous obtiendrez l'erreur.
enum CodingKeys:...