質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2595閲覧

Swift JsonSerializationについて

dev14se

総合スコア1

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/10/07 13:39

編集2020/10/07 13:48

前提

SwiftにてREST APIを用いてJsonを利用するときについて教えてください。

質問内容

AlamofireやURLSessionなどで、サーバーからJsonを取得する場合、
クライアント(iOS)ではまずData型でレスポンスを取得すると思います。
SwiftでJsonを扱う場合の流れは、
Data型 → Json → String、Intなどの構造体に変換だと思っております。
Data→Json : デコード
Json→解析して欲しいカラムを取得: パース

そこでDataを見れる型にするのが、JsonDecoderでのdecodeで、Codableプロトコルにてパースすると認識しているのですが、
以下のJsonSerializationは、デコードとパースを同時にしているのでしょうか?
今まで、ObjectMapperを利用して典型的なコードを書いていた為、
本件を意識したことがありませんでした。

またSwiftにてJsonを扱う場合は、以下のどちらのメソッドを利用しても同じなのでしょうか?

超基礎的とは理解しておりますが、基礎的なことほど納得するまで理解したいため、
ご教授できませんでしょうか?
このサイト見れば理解できるのでは?などでもありがたいです。
よろしくお願いいたします。

Swift

1let decoder = JSONDecoder() 2decode.decode(xxx.self, from: responseData)

Swift

1JSONSerialization.jsonObject(with: self, options: .allowFragments)

試したこと

Qiitaなどで、JsonDecoderでの記事は調査して、上記の通り理解しているつもりですが、
JsonSerializationは自分の理解力のなさで、どうも理解できておりません。
Appleのリファレンスも確認してみましたが、基礎的なことがわかっていないためか、
納得できませんでした。

環境

Xcode12
Swift5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

細かい点を挙げればキリはないと思いますが、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

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/10/08 00:01

ちなみに、上記コードは Playground で検証可能です。
dev14se

2020/10/08 12:45

大変わかりやすいご回答ありがとうございます。 プレイグラウンドでも一度試してみます。 これで理解がすすみました。感謝いたします。
TsukubaDepot

2020/10/08 12:49

Codable は結構深いので、teratail の過去問もご覧になっておくといいかもしれません。 キーワード検索で「Codable JSON」と検索すれば120件くらい引っかかります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問