Skip to main content

Archive, Codable, シリアライズ, JSON

共通

  • NSCoder protocol に準拠している必要がある

for NSCoder

  • NSKeyedArchiver::archivedData(withRootObject: Any, rquiringSecureCoding: Bool)
  • NSKeyedUnarchiver::unarchivedObject(ofClass: Class, from: Data)

for PropertyList

  • PropertyListEncoder::encode(Value)
  • PropertyListDecoder::decode(Type, from: Data)

for JSON

クラス

  • JSONEncoder::encode(Value)
  • JSONDecoder::decode(Type, from: Data)

サンプル

swift
struct CategoryData: Codable {
let name: String
let notebooks: [NotebookData]
}
struct NotebookData: Codable {
let name: String
}

こういうデータがあったとして

エンコードの例

swift
let category = CategoryData(name: "カテゴリ 1", notebooks: [
NotebookData(name: "のーと 1"),
NotebookData(name: "のーと 2"),
])

let encoder = JSONEncoder()
if let json = try? encoder.encode(category) {
if let jsonText = String(data: json, encoding: .utf8) {
print(jsonText)
}
}

json
{"name":"カテゴリ 1","notebooks":[{"name":"のーと 1"},{"name":"のーと 2"}]}

decode の例

swift
let jsonText = """
{
"name": "カテゴリ 1",
"notebooks": [
{"name": "のーと 1"},
{"name": "のーと 2"},
]
}
"""
let decoder = JSONDecoder()
if let data = jsonText.data(using: .utf8) {
if let category = try? decoder.decode(CategoryData.self, from: data) {
print(category)
}
}
  • 改行しても大丈夫
  • 行末の余分なカンマぐらいは許容してくれるようだ
  • コメントは 行コメントもブロックコメントもダメだった
  • 配列にしたい場合は CategoryData.self のところ、[CategoryData].self で良い
  • 日付の場合は気をつける必要がありそう dateDecodingStrategy ( TODO )

以前のメモ

これはこれでスッキリしていて良い

定義

swift
struct Info: Codable {
}

Decode ( data -> obj )

swift
let decoder = JSONDecoder()
if let info = try? decoder.decode(PersonalInfo.self, from: data) {
..
}

Encode ( obj -> data )

swift
let encoder = JSONEncoder()
if let data = try? encoder.encode(info) {
..
}