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

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

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

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

2113閲覧

swift3でjsonファイルを読み込みたい。

harima

総合スコア17

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2017/07/11 07:01

編集2017/07/12 02:39

Djsonファイルを他のアプリに流用したく色々試しましたが、print文で表示ができるようになったものの、データーの取得ができませんでした。どのようにすれば良いかご教授ください。

swift3

1import UIKit 2 3class ViewController: UIViewController { 4 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 let path : String = Bundle.main.path(forResource: "assets/sg/index0", ofType: "json")! 10 let fileHandle : FileHandle = FileHandle(forReadingAtPath: path)! 11 let data : NSData = fileHandle.readDataToEndOfFile() as NSData 12 let jsonStr = NSString(data: data as Data, encoding: String.Encoding.utf8.rawValue) 13 print(jsonStr!) 14 15 16 } 17} 18

jsonファイルは下記です。"北海道・東北"ならば3つの七福神の名前とナンバーを取得したく、"関東"だったら8つの七福神の名前とナンバーを取得したい。データは本来はもっとあります。サンプルデータを載せます。

json

1{ 2 "北海道・東北" : [ 3 { 4 "name" : "奥州仙臺七福神" , "number" : 0 5 } , { 6 "name" : "会津七福神" , "number" : 1 7 } , { 8 "name" : "出羽七福神" , "number" : 2 9 } 10 ] , 11 "関東" : [ 12 { 13 "name" : "とりで利根川七福神" , "number" : 3 14 } , { 15 "name" : "奥久慈大子七福神" , "number" : 4 16 } , { 17 "name" : "常陸七福神" , "number" : 5 18 } , { 19 "name" : "足利七福神" , "number" : 6 20 } , { 21 "name" : "八溝七福神" , "number" : 7 22 } , { 23 "name" : "横浜磯子七福神" , "number" : 8 24 } , { 25 "name" : "横浜七福神" , "number" : 9 26 } , { 27 "name" : "横浜瀬谷八福神" , "number" : 10 28 } 29 ] 30}

大変忙しいところ申し訳ありませんが、宜しくお願い致します。

自分なりに変換したソース

swift3

1do { 2 let jsonArray:NSArray = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray 3 print(jsonArray) 4 } catch { 5 print(error) 6 }

swift3のソースで

swift

1do{ 2 let jsonArray:NSArray = try JSONSerialization.jsonObject(with: data as Data , options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray 3 print(jsonArray) 4 5 } catch { 6 7 }

とすると実行エラーが発生しました。

Could not cast value of type '__NSDictionaryM' (0x10d5aa2b0) to 'NSArray' (0x10d5a9e28).

でNSArrayをNSDictionaryに変更して実行しますとエラーは発生しないのですが、表示がおかしくなります

swift

1do{ 2 let jsonArray:NSDictionary = try JSONSerialization.jsonObject(with: data as Data , options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary 3 print(jsonArray) 4 5 } catch { 6 7 }

printの結果

{ "\U5317\U6d77\U9053\U30fb\U6771\U5317" = ( { name = "\U5965\U5dde\U4ed9\U81fa\U4e03\U798f\U795e"; number = 0; }, { name = "\U4f1a\U6d25\U4e03\U798f\U795e"; number = 1; }, { name = "\U51fa\U7fbd\U4e03\U798f\U795e"; number = 2; } ); "\U95a2\U6771" = ( { name = "\U3068\U308a\U3067\U5229\U6839\U5ddd\U4e03\U798f\U795e"; number = 3; }, { name = "\U5965\U4e45\U6148\U5927\U5b50\U4e03\U798f\U795e"; number = 4; }, { name = "\U5e38\U9678\U4e03\U798f\U795e"; number = 5; }, { name = "\U8db3\U5229\U4e03\U798f\U795e"; number = 6; }, { name = "\U516b\U6e9d\U4e03\U798f\U795e"; number = 7; }, { name = "\U6a2a\U6d5c\U78ef\U5b50\U4e03\U798f\U795e"; number = 8; }, { name = "\U6a2a\U6d5c\U4e03\U798f\U795e"; number = 9; }, { name = "\U6a2a\U6d5c\U702c\U8c37\U516b\U798f\U795e"; number = 10; } ); }

となります。

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

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

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

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

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

fuzzball

2017/07/12 04:31

「表示がおかしくなります」ですが、おかしくありません。要素を抽出して表示(もしくはラベルにセットなど)すれば正しく表示されるはずですので、そのまま作業を続けて下さい。例えば print((jsonArray["北海道・東北"] as! [[String:Any]])[0]["name"]!) としてみて下さい。(jsonArrayは名前を変えた方がいいですね)
harima

2017/07/12 05:02

ありがとうございます。表示がおかしいのでダメなのかと思っていましいた。毎度毎度助けていただき、御礼申し上げます。
harima

2017/07/12 05:11

fuzzballさんをベストアンサーにしたいのですがベストアンサーにするボタンがありません。残念です。
fuzzball

2017/07/12 05:21 編集

御自分で正しい回答を書いてベストアンサー(自己解決)にするのが良いと思いますよ。
guest

回答1

0

ベストアンサー

Swift

1let jsonStr = NSString(data: data as Data, encoding: String.Encoding.utf8.rawValue)

ではなく

swift

1let jsonArray:NSArray = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray

です。

投稿2017/07/11 09:09

編集2017/07/12 01:28
NCC1701

総合スコア1680

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

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

harima

2017/07/12 00:56

すみませんが、swift2.xで書かれているようで、変換したところ"SIGABRT"エラーになってしまいました。swift3でお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問