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) {
..
}