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

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

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

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

Swift

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

Q&A

解決済

2回答

1237閲覧

SwiftyJSONでのパースについて

shsw228

総合スコア20

iOS

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

Swift

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

0グッド

0クリップ

投稿2019/02/24 14:31

編集2019/02/25 03:07

現在APIを叩いて返ってきた値を使ってUITableViewで表示するアプリを書いています。Alamofireのresponse.result.valueで取得できる値は以下のようになっています。

json

1[{"created_at" : "aaa" 2"author" : "bbb" 3"score" : "ccc" 4 5},{ 6"created_at" : "aaa" 7"author" : "bbb" 8"score" : "ccc" 9}]

DataModelを作成して代入するところが以下のようになっています。

swift

1 func getCellData(json:JSON){ 2 if let postedDateUnixTime = json[0]["created_at"].string { 3 postedDataModel.postedBy = json[0]["author"].stringValue 4 postedDataModel.scoreNumber = json[0]["score"].stringValue 5 print(postedDataModel.postedBy) 6 } 7 else{ 8 print("API unavailable") 9 } 10 } 11

  • 複数の{}があるとループ処理が要るのでとりあえず1つだけオプションで取得して、項目が抜き出せているか確認したのですが、どうやってもelseに流れてしまいます。

  • ifを外して実行したところpostedDateUnizTimeでnilになってクラッシュしました。

  • 一番外にある[]が原因なのかと思っていますが、ルートが配列のJSONに対して具体的にどうするべきなのかがわかりません。

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

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

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

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

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

fuzzball

2019/02/25 01:36

インデントを揃えて下さい。見にくいです。
fuzzball

2019/02/25 01:38

一方だけ伏せているのだと思うのですが、"項目1" か ["created_at"] か、どちらかに合わせて下さい。 今のコードだとデータを取り出せなくて当然です。
fuzzball

2019/02/25 01:40

>>返り値は以下のようになっています これは、どこで何を表示した結果でしょうか?
shsw228

2019/02/25 03:11

どこのインデントでしょうか、すみません どこが揃うべきなのかいまいちわかっていないもので… 返り値は質問文に追記しました。 この関数の前準備としてJSONを取得する関数があり、そのなかでresponse.result.valueをprintで途中で吐かせている形です。JSONを取得はできていることを言いたかったです。
fuzzball

2019/02/25 03:58

>>JSONを取得はできていることを言いたかったです getCellData(json:JSON) の中で json が正しく受け取れているか確認して下さい。 >>一番外にある[]が原因なのかと思っていますが [ ]は配列ということです。
shsw228

2019/02/25 05:21

きちんと受け取れていなかったようです。実際nilがでているので DataModelを使用せず単に配列に代入するように書き直したところ自己解決してしまいました。なぜダメだったのかは分からず終いですが… ルートが配列の形になっていてもjson["0"]["created_at"]のように抜き出すことはできるのでしょうか?
fuzzball

2019/02/25 05:32

>>実際nilがでているので 変数jsonがnilだったってことですか? そうであれば、getCellData(json:)を呼び出しているコード見ないと原因は分かりません。 >>json["0"]["created_at"]のように json["0"] じゃダメですよ。これは辞書型のアクセス方法です。
guest

回答2

0

Codable

swift

1let json = """ 2[ 3 { 4 "created_at":"0aaa", 5 "author":"0bbb", 6 "score":"0ccc" 7 }, 8 { 9 "created_at":"1aaa", 10 "author":"1bbb", 11 "score":"1ccc" 12 } 13] 14""".data(using: .utf8)! 15 16struct Response: Codable { 17 var created_at: String 18 var author: String 19 var score: String 20} 21 22if let responses = try? JSONDecoder().decode([Response].self, from: json) { 23 print(responses[0]) //=> Response(created_at: "0aaa", author: "0bbb", score: "0ccc") 24 print(responses[1].author) //=> 1bbb 25}

投稿2019/03/28 05:19

fuzzball

総合スコア16731

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

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

0

自己解決

配列に代入してからアクセスする形式に変えて解決しました。

投稿2019/03/28 04:01

shsw228

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問