0Pricing
Swift Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Codableへの適合
  2. JSONEncoderによるエンコード
  3. JSONDecoderによるデコード
  4. Optional型とネストした型の処理
← Swift Academyに戻る