次のエラーが表示されます。
データが欠落しているため、データを読み取れませんでした。
次のコードを実行すると:
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であり、ターゲットが適切に設定されています。
ありがとう
私は、プロパティリストデコーダーに関する同様の問題を最後に解決しました。
この場合のエラーは、データ全体ではなく、キーが見つからなかったことを意味するようです。
構造体の変数をオプションに設定してみてくださいそして、問題のある場所でnil値を返します。
説明だけではなく、実際のエラーを印刷してみてください。 "No value associated with key someKey (\"actual_key_if_you_defined_your_own\")."
のようなメッセージが表示されるはずです。これはlocalizedDescription
よりもはるかに便利です。
印刷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)
}
最も重要な情報のみが表示されます。
"データが欠落しているためデータを読み取れませんでした"
このコードからのエラー:
...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:...