このツールの動作
JSON の標本が、Codable に準拠した Swift の構造体になります。
{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
struct Root: Codable {
let id: Int
let firstName: String
let address: Address
}
struct Address: Codable {
let city: String
}
JSONDecoder がそのまま読みます。入れ子のオブジェクトはそれぞれ構造体になり、根がオブジェクトの配列なら typealias が付くので、並びにも名前がつきます。
名前を変えた場所には CodingKeys を
プロパティ名にハイフンは使えず、数字でも始められず、予約語にはバッククォートが要ります。鍵をそのまま名前にできないとき、対応が書き出されます。
struct Root: Codable {
let contentType: String
let `class`: Int
let f2fa: Bool
enum CodingKeys: String, CodingKey {
case contentType = "content-type"
case `class`
case f2fa = "2fa"
}
}
`class` に対応が付かないことにご注目ください。バッククォートは Swift が名前をどう読むかを変えるだけで、名前そのものは変えていません。列挙は、ひとたび存在するなら全部の場合を並べます。欠けた CodingKeys は、書かれなかったプロパティを黙って落としてしまうからです。
JSONValue と、それがある理由
null、空の配列、型の混ざった配列からは、推し量れるものがありません。Swift には復号も符号化もできる「任意の JSON 値」が用意されていないので、小さな列挙を末尾に一度だけ出します。
let nickname: JSONValue?
let tags: [JSONValue]
JSON が持ちうる六つのものだけを扱います。あとで「null を許す文字列」だと分かれば、String? に置き換え、列挙は消せます。
標本が言えないこと
省略可能になるのは null だけです。ほかはすべて省略不可です。文書に値があったからで、あとから付ける ? は一文字で済むのに対し、余計な ? は、項目が欠けていることを、それが問題になる時まで隠してしまいます。
Int と Double は、値ではなく数値の書かれ方から決まります。3 は Int、3.0 は Double です。Swift ではこの違いが効きます。3.5 を Int に復号すると、丸めではなく例外になります。
プライバシー
すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。