Swiftでいこう! - JsonのDecode,配列。
データをJsonで受け取り利用することが多いと思います。そこでちょっと知っていれば便利なことを記録しておきたいと思います。
JsonとはもともとJavaScriptで使われていたもので今ではたくさんのプログラム言語で使われています。基本は、
コロン ":"で挟んで"名前":"値"を記述したもの
であります。参考サイトです。
整理してみます。
{ "名前": "値"} ・・・ 基本
複数のデータある場合は
{
"名前1": "値1",
"名前2": "値2",
"名前3": "値3"
}
そして、さらにJsonデータが複数ある場合は、配列にすることができます。
[
{
"名前1": "値1",
"名前2": "値2",
"名前3": "値3"
},
{
"名前1": "値1",
"名前2": "値2",
"名前3": "値3"
}
]
下記を記述したenp.jsonを作って、PlaygroundnのResourcesに入れて、
[
{
"age" : 45,
"code" : "001",
"name" : "山田",
"absence" : false
},
{
"age" : 30,
"code" : "002",
"name" : "鈴木",
"absence" : true
},
{
"age" : 25,
"code" : "003",
"name" : "佐藤",
"absence" : false
}
]
以下を実行してみると、
struct Employee: Codable {
var code: String // 社員コード
var name: String // 名前
var age: Int // 年齢
var absence: Bool // 休暇中フラグ
}
guard let url = Bundle.main.url(forResource: "enp", withExtension: "json") else {
fatalError("ファイルが見つからない")
}
guard let data = try? Data(contentsOf: url) else {
fatalError("ファイル読み込みエラー")
}
let decoder = JSONDecoder()
guard let employees = try? decoder.decode([Employee].self, from: data) else {
fatalError("JOSN読み込みエラー")
}
for employee in employees {
print(employee)
}
Employee(code: "001", name: "山田", age: 45, absence: false)
Employee(code: "002", name: "鈴木", age: 30, absence: true)
Employee(code: "003", name: "佐藤", age: 25, absence: false)
とうまくいきました。
ファイルのアドレスを定数"url"に取得します。
guard let url = Bundle.main.url(forResource: "enp", withExtension: "json") else {
fatalError("ファイルが見つからない")
}
"url"のデータ読み込みます。
guard let data = try? Data(contentsOf: url) else {
fatalError("ファイル読み込みエラー")
}
変数dataを解析します。
let decoder = JSONDecoder()
guard let employees = try? decoder.decode([Employee].self, from: data) else {
fatalError("JOSN読み込みエラー")
}
try? decoder.decode([Employee].self, from: data)
デコードをするのですが何をしているかというと、
([Employee].self, from: data)
Jasonファイルのdataを配列[Employee]に当てはめてdecoder.decodeにより解析します。これは[Employee]となっているので、配列の形となっています。もう一度今回使ったJsonをみてみましょう。
[
{
"名前1": "値1",
"名前2": "値2",
},
{
"名前1": "値1",
"名前2": "値2",
}
]
この形です。
配列ではない時はどうなるでしょうか
{
"名前1": "値1",
"名前2": "値2",
"名前3": "値3"
}
単純なデータ、配列ではないデータについては、配列の場合は
try? decoder.decode([Employee].self, from: data)
でした。では配列ではない時はというと
try? decoder.decode(Employee.self, from: data)
配列の"[ ]"を外して使います。この部分を間違えるとパースエラーとなるので気をつけます。