JSONDecoderによるデコード
JSONデータを型付きのSwift値に解析します。
「JSONDecoderによるデコード」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
JSONDecoder の作成
JSONDecoder はJSONの Data からSwiftの値を再構築します。生成する型を指定し、バイト列を渡します。
import Foundation
struct City: Codable {
var name: String
var population: Int
}
let json = "{\"name\":\"Oslo\",\"population\":700000}"
let data = json.data(using: .utf8)!
let city = try JSONDecoder().decode(City.self, from: data)
print(city.name, city.population).self による型の指定
最初の引数はメタタイプで、MyType.self と記述します。これにより、データからどの構造を構築するかをデコーダーに伝えます。
import Foundation
struct Flag: Codable { var ok: Bool }
let data = "{\"ok\":true}".data(using: .utf8)!
let result = try JSONDecoder().decode(Flag.self, from: data)
print(result.ok)配列のデコード
JSON配列をデコードするには、[Int].self や [MyStruct].self のような配列型を指定します。
import Foundation
let json = "[10, 20, 30]"
let data = json.data(using: .utf8)!
let numbers = try JSONDecoder().decode([Int].self, from: data)
print(numbers.reduce(0, +))ネストされたオブジェクトのデコード
ネストされたJSONオブジェクトは、ネストされた Codable 構造体に対応します。デコーダーがツリーをたどり、各階層を自動的に埋めます。
import Foundation
struct Coord: Codable { var lat: Double; var lon: Double }
struct Place: Codable { var name: String; var coord: Coord }
let json = "{\"name\":\"X\",\"coord\":{\"lat\":1.0,\"lon\":2.0}}"
let p = try JSONDecoder().decode(Place.self, from: json.data(using: .utf8)!)
print(p.coord.lat, p.coord.lon)デコードエラーの捕捉
データが型と一致しない場合、decode はエラーをスローします。do/catch で囲むと、不正な入力を適切に処理できます。
import Foundation
struct User: Codable { var name: String }
let bad = "{\"wrong\":1}".data(using: .utf8)!
do {
let u = try JSONDecoder().decode(User.self, from: bad)
print(u.name)
} catch {
print("Failed:", error)
}keyNotFound エラー
よくある失敗の1つが DecodingError.keyNotFound です。必須キーが存在しない場合にスローされます。エラーをパターンマッチすると、何が問題だったのかを正確に報告できます。
import Foundation
struct User: Codable { var name: String }
let bad = "{}".data(using: .utf8)!
do {
_ = try JSONDecoder().decode(User.self, from: bad)
} catch let DecodingError.keyNotFound(key, _) {
print("Missing key:", key.stringValue)
} catch {
print("Other error:", error)
}typeMismatch エラー
値のJSON型が正しくない場合、たとえば Int が必要な場所に文字列がある場合、デコーダーは DecodingError.typeMismatch をスローします。
import Foundation
struct Count: Codable { var n: Int }
let bad = "{\"n\":\"oops\"}".data(using: .utf8)!
do {
_ = try JSONDecoder().decode(Count.self, from: bad)
} catch let DecodingError.typeMismatch(type, _) {
print("Type mismatch, expected:", type)
} catch {
print("Other:", error)
}dataCorrupted エラー
無効なJSON構文があると、DecodingError.dataCorrupted が発生します。通常、バイト列がそもそも有効なJSONではないことを意味します。
import Foundation
struct User: Codable { var name: String }
let bad = "not json".data(using: .utf8)!
do {
_ = try JSONDecoder().decode(User.self, from: bad)
} catch is DecodingError {
print("Decoding failed: data corrupted")
} catch {
print("Other:", error)
}オプショナルへのデコード
プロパティがオプショナルの場合、キーが存在しなければエラーをスローせずに nil にデコードされます。これにより、オプショナルなフィールドはデータの欠落を許容できます。
import Foundation
struct Profile: Codable {
var name: String
var bio: String?
}
let json = "{\"name\":\"Kai\"}"
let p = try JSONDecoder().decode(Profile.self, from: json.data(using: .utf8)!)
print(p.name, p.bio ?? "no bio")デコーダーの再利用
エンコーダーと同様に、設定済みの JSONDecoder は複数のペイロードに再利用できます。1つのインスタンスを保持し、さまざまな入力をそれでデコードします。
import Foundation
struct Word: Codable { var text: String }
let decoder = JSONDecoder()
let inputs = ["{\"text\":\"hi\"}", "{\"text\":\"bye\"}"]
for s in inputs {
let w = try decoder.decode(Word.self, from: s.data(using: .utf8)!)
print(w.text)
}デコード、確認、利用
一連の処理は、Data を受け取り、do/catch 内で型付きの値にデコードし、その後、型安全な結果を安全に利用するという流れです。
import Foundation
struct Weather: Codable {
var city: String
var temp: Double
}
let json = "{\"city\":\"Rome\",\"temp\":21.5}"
do {
let w = try JSONDecoder().decode(Weather.self, from: json.data(using: .utf8)!)
print("\(w.city): \(w.temp)C")
} catch {
print("Decode error:", error)
}クイックチェック: JSONDecoder
デコードについての知識を確認します。
まとめ: JSONDecoder によるデコード
JSONからSwiftの値を再構築する方法を学びました。
decode(MyType.self, from: data)は型付きの値を生成します。- 配列、ネストされたオブジェクト、オプショナルは自動的にデコードされます。
decodeはDecodingErrorの各ケースであるkeyNotFound、typeMismatch、dataCorrupted、valueNotFoundをスローします。- 不正な入力を処理するには、呼び出しを
do/catchで囲みます。
よくある質問
「JSONDecoderによるデコード」レッスンは無料ですか?
はい。「JSONDecoderによるデコード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「JSONDecoderによるデコード」で何を学びますか?
JSONデータを型付きのSwift値に解析します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「JSONDecoderによるデコード」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Codableへの適合
- JSONEncoderによるエンコード
- JSONDecoderによるデコード
- Optional型とネストした型の処理