web-dev-qa-db-ja.com

「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であり、ターゲットが適切に設定されています。

ありがとう

20
Jalem

私は、プロパティリストデコーダーに関する同様の問題を最後に解決しました。

この場合のエラーは、データ全体ではなく、キーが見つからなかったことを意味するようです。

構造体の変数をオプションに設定してみてくださいそして、問題のある場所でnil値を返します。

34
Tyler

説明だけではなく、実際のエラーを印刷してみてください。 "No value associated with key someKey (\"actual_key_if_you_defined_your_own\")."のようなメッセージが表示されるはずです。これはlocalizedDescriptionよりもはるかに便利です。

23
Fizker

印刷error.localizedDescriptionは、まったく意味のない一般的なエラーメッセージのみを表示するため、誤解を招きます。

localizedDescription catchブロックで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)
}

最も重要な情報のみが表示されます。

23
vadian

"データが欠落しているためデータを読み取れませんでした"

このコードからのエラー:

...catch {
    print(error.localizedDescription)
}

理由:キーが見つからないか、入力ミスがあるようです。

次のようにコーディングすることで、どのキーが欠落しているを確認できます。

...catch {
    debugPrint(error)
}

注:構造体キーがJSONデータキーと異なる場合は、以下の例を参照してください:構造体のキーは 'title'ですが、データのキーは 'name'です。

struct Photo: Codable {
    var title: String
    var size: Size

    enum CodingKeys: String, CodingKey
    {
        case title = "name"
        case size
    }
}

「名前」を誤って入力すると、エラーが表示されます。

また、この 'CodingKeys'を誤って入力すると、エラーが発生します。

enum CodingKeys:...
2
Fuad Ahmad