細かい点を挙げればキリはないと思いますが、JSONの形式がわかっているのであれば
- JSONSerializaton は Dictionary からキー検索を行い、型変換しなければならない手間がある
- Codable を使えば、その辺りの処理はコンパイラが記述してくれる
の違いになるかと思います。
下記は簡単な比較例です。
当然、Codable の場合でも Int
を期待していたのに null
が戻ってくる、あるいはキーそのものが存在しないなど、色々な条件が考えられるのですが、その辺りについてはコード中にある
が詳しいので、そちらをご参照いただければと思います。
Swift
1import UIKit
2
3// 共通データ
4let data = """
5{
6 "name": "taro",
7 "sex": null,
8 "age": 23,
9 "phone": 1234567890,
10 "url": "httpd://teratail.com/",
11}
12""".data(using: .utf8)!
13
14
15// JSONSerialization
16var name: String = ""
17var sex: String?
18var age: Int = 0
19var phone: Int = 0
20var url: String = ""
21
22
23do {
24 // JSON データを Dictionary に変換
25 let decodedData = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
26
27 // ちまちまとデータを変換する
28 name = (decodedData["name"] as? String) ?? "no name"
29 sex = (decodedData["sex"] as? String) ?? "not descibed"
30 age = (decodedData["age"] as? Int) ?? -1
31 phone = (decodedData["phone"] as? Int) ?? -1
32 url = (decodedData["url"] as? String) ?? "no url"
33
34 //
35 print("parsed data by JSONSerialization")
36 print("name: ", name)
37 print("sex: ", sex)
38 print("age: ", age)
39 print("phone: ", phone)
40 print("url: ", url)
41} catch {
42 print("error in JSONSerialization", error.localizedDescription)
43}
44
45print("---")
46
47// Codable
48struct Person: Decodable {
49 var name: String
50 var sex: String?
51 var age: Int
52 var phone : Int
53 var url : String
54}
55
56do {
57 let decodedData = try JSONDecoder().decode(Person.self, from: data)
58
59 // 型の例外処理については本文参照
60 // https://qiita.com/Mt-Hodaka/items/d14447a429948a3fb28c
61 print("parsed data by JSONSerialization")
62 print("name: ", decodedData.name)
63 print("sex: ", decodedData.sex ?? "not described")
64 print("age: ", decodedData.age)
65 print("phone: ", decodedData.phone)
66 print("url: ", decodedData.url)
67} catch {
68 print("error in JSONDecorder()", error.localizedDescription)
69
70}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/08 00:01
2020/10/08 12:45
2020/10/08 12:49