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

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

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

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

Q&A

解決済

1回答

5018閲覧

swift3でJSON値の取り出し方法

IzuShin

総合スコア68

Swift

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

0グッド

0クリップ

投稿2017/02/27 03:08

編集2017/02/27 11:32

以下のような記述でPHPから返されるJSON値を取得しています。

let jsonArr:NSDictionary = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary
print("(jsonArr)")

printではjsonArr値は以下のような値が取れております。
{
0 = "name:A,hobby:AA";
1 = "name:B,hobby:BB";
2 = "name:C,hobby:CC";
}

ここでキーを指定して値とりたいのですが、うまくいきません。
書籍では以下のような取得方法と記されておりました。
for json in jsonArr {
let json_name = json["name"] as String
let json_hobby = json[“hobby"] as String
}

ですが、以下のようなエラーがでてコンパイルが通りません。
Type 'NSDictionary.Iterator.Element' (aka '(key: Any, value: Any)') has no subscript members

何が誤っているかご存知の方がおられましたら教えてください。
よろしくお願いします。

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

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

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

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

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

fuzzball

2017/02/27 04:35 編集

コードやログなどは手打ちせずコピペして下さい。
fuzzball

2017/02/27 04:38

なぜNSDictionaryにキャストしているのでしょうか?
IzuShin

2017/02/27 04:43

コードもログもコピペしております。NSDictionaryにキャストした理由は、書籍の通りにキー指定で値がとれると思ったからです。
fuzzball

2017/02/27 04:44

「print("\(jsonArr)”)」←全角文字が混じっていますが?このままだとエラーになるはずですよ。
IzuShin

2017/02/27 04:52

失礼しました。コピペしたはずなのですが・・・、確認します。
guest

回答1

0

ベストアンサー

php

1$array[] = array("name" => "A", "hobby" => "AA"); 2$array[] = array("name" => "B", "hobby" => "BB"); 3$array[] = array("name" => "C", "hobby" => "CC"); 4$json = json_encode( $array); 5print($json);

swift

1let jsonArr = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:Any]] 2print(type(of: jsonArr)) 3//=> Array<Dictionary<String, Any>> 4 5for json in jsonArr { 6 let json_name = json["name"] as! String 7 let json_hobby = json["hobby"] as! String 8 print(json_name, json_hobby) 9} 10//=> A AA 11//=> B BB 12//=> C CC

投稿2017/02/27 04:41

編集2017/02/28 00:16
fuzzball

総合スコア16731

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

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

IzuShin

2017/02/27 04:44

fuzzballさん ご回答ありがとうございます。 確認してみます。
fuzzball

2017/02/27 05:18

キャストを修正しました。
IzuShin

2017/02/27 10:34

fuzzballさん 教えていただいたコードを実行しましたが、以下のようなエラーになってしまいました。 PHP側のJSONを作る部分が誤っているのでしょうか? Could not cast value of type '__NSDictionaryI' (0x10de2d238) to 'NSArray' (0x10de2cdd8).
IzuShin

2017/02/27 10:35

PHP側では以下のように記述してJSON値を作っております。 $array[] = 'name:A,hobby:AA'; $array[] = 'name:B,hobby:BB'; $array[] = 'name:C,hobby:CC'; $json = json_encode( $array,JSON_FORCE_OBJECT); print($json);
fuzzball

2017/02/27 10:40

jsonObject(with:options:)する前のJSONを書いて下さい。
fuzzball

2017/02/27 10:48

そのエラーはどこで出ているのでしょうか?また、質問内の情報は現在でも正しいでしょうか?変わっているのであれば更新して下さい。
IzuShin

2017/02/27 11:43

fuzzballさん ご回答ありがとうございます。 print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) ?? "") let jsonArr = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:Any]] 上記のようなコードを実行したところ、printで出力されるJSON値は下記になります。 {"0":"name:A,hobby:AA","1":"name:B,hobby:BB","2":"name:C,hobby:CC"} エラーは let jsonArr = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:Any]] の行で出ている模様です。 何度も申し訳有りませんが、教えてください。
fuzzball

2017/02/27 12:13

そのJSONではダメです。 PHPのことは分からないのですが、JSON_FORCE_OBJECTを指定しない場合のJSONを書いて下さい。
fuzzball

2017/02/28 00:18 編集

PHP側のコードと、Swift側の出力コードを追加しました。(パース部分は昨日のままです)
IzuShin

2017/02/28 02:22

fuzzballさん ありがとうございます。 色々と勉強不足で上手く書き込みができずに申し訳ありませんでした。 これで作りたいアプリが実現できそうです。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問