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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

2600閲覧

【Swift】AlamofireとSwiftyJSONを用いたサーバーとの疎通におけるnil発生問題

OGT_kumi

総合スコア13

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2018/01/21 10:59

編集2018/01/27 06:45

###前提・実現したいこと
swiftでiOSアプリを作成しています。
現在、サーバーサイドとの疎通テストで、alamofireとswiftyJSONを使いJSONでデータ通信を行なっています。
サーバー側の設定で、クライアントからサーバーにJSONをPOSTし、成功すると特定のデータ(name,uid,id,token)がJSONで返送されてくる仕様になっています。
今、サーバーから返送されてきたJSONに入っているidとtokenを取り出してappDelegateに作成した変数に格納する処理を書いています。

###発生している問題・エラーメッセージ
サーバーから返送されてきたJSONを、SwiftyJSONを使用しパースするところまではできました。
返送されてきたJSONは以下になります。

{"user":{"name":"Tanaka Taro","uid":1283726151111,"id":66,"authenticate_token":"xxxxxxx"}}

パースしたJSONファイルからidとtokenを取り出し、appDeledateの変数(id, authToken)に格納するところで、nilとなりうまく格納することができません。

###該当のソースコード
こちらは、JSONをPOSTするViewControllerです。

let myAppDelegate = UIApplication.shared.delegate as! AppDelegate var url: String? url = "https:xxxxxx" let params = ["uid":1283726151111, "name":self.defaultNickName] as [String : Any] Alamofire.request(url!, method: .post, parameters: params, encoding: JSONEncoding.default).responseString(completionHandler:{ response in print(response.value as Any) guard let object = response.result.value else { return } let json = JSON(object) print(json) print(json["user"]) print(type(of: json)) if let id = json["user"]["id"].int { print(id) //=> 66 print(type(of: id)) myAppDelegate.id = id print(myAppDelegate.id) } else{ print("id does not exist.") }

こちらは、AppDelegateの上の方です。

var id:Int! var authToken: String = ""

###試したこと
ウェブで調べて色々試しましたが、どれを試してもnilになってしまいエラーがでます。
お手数おかけしますが、どうぞ教えてください!

###補足情報(言語/FW/ツール等のバージョンなど)
swift4.0

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

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

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

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

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

komo_ta

2018/01/21 12:58

こちらはどうでしょうか → json["user"]["uid"].int / json["user"]["uid"].string
OGT_kumi

2018/01/22 13:17

ご回答ありがとうございます。試したところ、nilが帰ってきました。json["user"]["ud"].intValueで試すと、0(初期値)が帰ってきました。
komo_ta

2018/01/22 23:59

それはfor文の中で試されましたか? let json = JSON(object) のすぐ下で試してみましたか?
OGT_kumi

2018/01/25 15:22

let json = JSON(object) のすぐ下で試してみました。
guest

回答1

0

ベストアンサー

idを取得したいだけなら、

swift

1//idの存在が保証されている場合 2let id = json["user"]["id"].intValue 3print(id) //=> 66 4print(type(of: id)) //=> Int 5 6//idの存在が保証されていない場合 7if let id = json["user"]["id"].int { 8 print(id) //=> 66 9 print(type(of: id)) //=> Int 10} else { 11 print("id does not exist.") 12}

でいいと思います。

投稿2018/01/22 00:43

編集2018/01/22 00:53
fuzzball

総合スコア16731

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

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

OGT_kumi

2018/01/22 13:16

ご回答ありがとうございます。 idの存在は保証されているので、上の方で試して見ましたが、 print(id) → 0(初期値) print(type(of:id)) → Int となりました。 jsonのパースまではできているのですが、そこからうまくidを取り出せていない状況です、、、
OGT_kumi

2018/01/22 13:23

念のためidの存在が保証されていないパターンを試して見ました。 it doesn't existが出力されたので、jsonにidが格納されていないということでしょうか。 ただ、print(json)をすると {"user":{"name":"Tanaka Taro","uid":1283726151111,"id":66,"authenticate_token":"xxxxxxx"}} が出力されます。 これは、どう解釈したらよいのでしょうか?
fuzzball

2018/01/23 00:21

print(json["user"]) の出力を教えて下さい。
OGT_kumi

2018/01/25 15:21

ご返信が遅れてしまい申し訳ありません。 null が出力されました、、、
fuzzball

2018/01/26 00:28

print(json)だと中身が表示されるのにprint(json["user"])だとnilになるというということでしょうか?質問内のコードをprint文を含めたものに更新してもらえますか?(位置を確認したいので) あとついでに print(type(of: json)) も追加して出力を教えて下さい。
OGT_kumi

2018/01/27 06:46

>print(json)だと中身が表示されるのにprint(json["user"])だとnilになるというということでしょうか? はい、その通りです。 >質問内のコードをprint文を含めたものに更新してもらえますか?(位置を確認したいので) 更新いたしました。ご確認ください。 >print(type(of: json)) も追加して出力を教えて下さい。 JSONが返ってきました。
OGT_kumi

2018/01/28 09:31

パースする前に、サーバーから送られてくるデータをStringからNSData型に変換。そのあとにパースしたらちゃんと動きました。 ご丁寧にお付き合いいただきありがとうございました。
OGT_kumi

2018/01/28 09:31 編集

guard let objectStr = response.result.value else { return } let object = objectStr.data(using: String.Encoding.utf8) // 追加 let json = JSON(object as Any) print(json) print(json.count) print(json["user"]["id"])
fuzzball

2018/01/29 00:22

あー、responseStringだからStringで返ってくるのかな。(ソースの右の方まで見てませんでした‥) Data型で欲しいならresponseDataを使えばいいような気もしますが。 どちらにしても、私の回答がベストアンサーとは思えないので、御自分で回答を書いてベストアンサーにした方が良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問