web-dev-qa-db-fra.com

Erreur "Impossible de lire les données car elles sont manquantes" lors du décodage de JSON dans Swift

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

20
Jalem

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.

34
Tyler

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.

23
Fizker

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.

23
vadian

"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:...
2
Fuad Ahmad