JSONEncoderによるエンコード
Swiftの値からJSONデータを生成します。
「JSONEncoderによるエンコード」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
JSONEncoder の作成
JSONEncoder は、任意の Encodable な値をJSONの Data に変換する中心的な役割を担います。インスタンスを作成し、値に対して encode(_:) を呼び出します。
import Foundation
struct Movie: Codable {
var title: String
var year: Int
}
let encoder = JSONEncoder()
let data = try encoder.encode(Movie(title: "Up", year: 2009))
print(data.count, "bytes")Data から読みやすい String へ
encode(_:) はバイナリの Data を返します。読み取るには、String(data:encoding:) を使ってバイト列をUTF-8としてデコードします。
import Foundation
struct Movie: Codable {
var title: String
var year: Int
}
let data = try JSONEncoder().encode(Movie(title: "Up", year: 2009))
let text = String(data: data, encoding: .utf8)!
print(text)整形済み出力
デフォルトではJSONはコンパクトです。outputFormatting = .prettyPrinted を設定すると、インデントと改行が追加され、人間が読みやすい結果になります。
import Foundation
struct Movie: Codable {
var title: String
var year: Int
}
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(Movie(title: "Up", year: 2009))
print(String(data: data, encoding: .utf8)!)安定した出力のためのキーの並べ替え
オプションは配列で組み合わせることができます。.sortedKeys を追加するとキーがアルファベット順に並び、出力が決定的になります。そのため、テストやスナップショットに適しています。
import Foundation
struct Movie: Codable {
var title: String
var year: Int
var rating: Double
}
let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
let data = try encoder.encode(Movie(title: "Up", year: 2009, rating: 4.8))
print(String(data: data, encoding: .utf8)!)配列のエンコード
コレクションは直接エンコードできます。Encodable な値の配列は、JSON配列になります。
import Foundation
struct Movie: Codable {
var title: String
var year: Int
}
let list = [Movie(title: "Up", year: 2009),
Movie(title: "Coco", year: 2017)]
let data = try JSONEncoder().encode(list)
print(String(data: data, encoding: .utf8)!)辞書のエンコード
[String: Encodable-element] 型の辞書はJSONオブジェクトにエンコードされます。.sortedKeys を追加しない限り、キーの順序は保証されない点に注意してください。
import Foundation
let scores: [String: Int] = ["alice": 90, "bob": 75]
let encoder = JSONEncoder()
encoder.outputFormatting = .sortedKeys
let data = try encoder.encode(scores)
print(String(data: data, encoding: .utf8)!)ネストされた構造のエンコード
ネストされた Codable 型は再帰的にエンコードされ、ネストされたJSONオブジェクトが自動的に生成されます。
import Foundation
struct Author: Codable { var name: String }
struct Post: Codable {
var title: String
var author: Author
}
let p = Post(title: "Hello", author: Author(name: "Mae"))
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
print(String(data: try encoder.encode(p), encoding: .utf8)!)エンコーダーの再利用
設定済みの JSONEncoder は、複数の値に再利用できます。一度設定して、コード全体で同じ書式を適用し続けます。
import Foundation
struct Tag: Codable { var name: String }
let encoder = JSONEncoder()
encoder.outputFormatting = .sortedKeys
for t in [Tag(name: "swift"), Tag(name: "json")] {
let data = try encoder.encode(t)
print(String(data: data, encoding: .utf8)!)
}数値とブール値のエンコード
数値とブール値のプロパティは、引用符なしのJSONリテラルとしてエンコードされます。文字列には引用符が付きますが、Int、Double、Bool には付きません。
import Foundation
struct Stats: Codable {
var count: Int
var ratio: Double
var enabled: Bool
}
let data = try JSONEncoder().encode(Stats(count: 3, ratio: 0.75, enabled: true))
print(String(data: data, encoding: .utf8)!)オプショナルのエンコード
デフォルトでは、nil のオプショナルはJSONから完全に省略されます。nil でないオプショナルは、ラップされている値としてエンコードされます。
import Foundation
struct Item: Codable {
var name: String
var note: String?
}
let data = try JSONEncoder().encode(Item(name: "Pen", note: nil))
print(String(data: data, encoding: .utf8)!)一連の処理
一般的なエンコードの流れは、値を作成し、エンコーダーを設定し、encode を呼び出し、その後 Data をログ出力や送信用の String に変換するというものです。
import Foundation
struct Order: Codable {
var id: Int
var items: [String]
}
let order = Order(id: 42, items: ["a", "b"])
let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
let data = try encoder.encode(order)
print(String(data: data, encoding: .utf8)!)クイックチェック: JSONEncoder
エンコードについての知識を確認します。
まとめ: JSONEncoder によるエンコード
Swiftの値をJSONに変換する方法を学びました。
encode(_:)はDataを返します。String(data:encoding:)で変換できます。.prettyPrintedや.sortedKeysを指定したoutputFormattingで、出力形式を制御できます。- 配列、辞書、ネストされた型、数値、ブール値、オプショナルはすべて適切にエンコードされます。
- 設定済みのエンコーダーは、複数の値にわたって再利用できます。
よくある質問
「JSONEncoderによるエンコード」レッスンは無料ですか?
はい。「JSONEncoderによるエンコード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「JSONEncoderによるエンコード」で何を学びますか?
Swiftの値からJSONデータを生成します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「JSONEncoderによるエンコード」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Codableへの適合
- JSONEncoderによるエンコード
- JSONDecoderによるデコード
- Optional型とネストした型の処理