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

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

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

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

Swift

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

Q&A

解決済

1回答

2120閲覧

SwiftでJSONをパースして、内容を処理したいです。

takaswy

総合スコア15

JSON

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

Swift

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

0グッド

1クリップ

投稿2017/06/28 19:27

###前提・実現したいこと
macOS10.12.5、Xcode8.3.3にて、PlaygroundにてSwiftの勉強をしております。
bitFlyer APIを利用して、"bid"と"ask"の価格差を計算してみたいと思っております。
[Swift 3.0] PlaygroundでURLSessionを使う
こちらを参考にして、Playgroundにて、bitFlyerAPIからJSONデータを受け取り表示するところまではできました。

得られたJSONデータの、"best_ask"、"best_bid"からその差である"spread"を求めてみたいと思っています。

import Foundation import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true class Client { func someTask(){ // let url = URL(string: "http://date.jsontest.com/")! let url = URL(string: "https://api.bitflyer.jp/v1/getticker")! let task = URLSession.shared.dataTask(with: url){ data, response, error in if let jsonData = data { self.printJSON(jsonData) } } task.resume() } func printJSON(_ data: Data){ do { let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) print(json) } catch { print("parse error!") } } } let client = Client() client.someTask() // http://dev.classmethod.jp/smartphone/iphone/swift-3-playground-urlsession/

イメージ説明
コンソールエリアにJSONデータが表示されています。
このコンソールエリアの最後に、
Spread = ○○○○○○
の形で、( best_ask ) - ( best_bid )
を表示したいと思っております。

追加で質問なのですが、
bitFlyer Lightning API Playgroundでのデータの順番
イメージ説明

イメージ説明
Xcodeでの21行目、22行目のデータの順番が異なるのは、なぜなのでしょうか?

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

整数なのであれば、

swift

1print(Int(json["best_ask"]!)!) 2//=> 284000

で取り出せます。実数ならIntをDoubleに変えて下さい。

パース後のデータ(変数json)はDictionary型だと思いますが、Dictionary型は並び順が保証されていませんし、キーでアクセスするのであれば並び順は関係ありません。

【追記】

swift

1let json = try JSONSerialization.jsonObject(/*略*/) as! [String:Any] //※キャスト追加 2let best_ask = (json["best_ask"] as! NSNumber).intValue 3print(best_ask)

best_askが存在しない時は落ちます。

投稿2017/06/29 00:19

編集2017/06/30 01:00
fuzzball

総合スコア16731

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

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

takaswy

2017/06/29 11:21

回答ありがとうございます。 教えていただきました一文を、どこに挿入すればよろしいのでしょうか? 試行錯誤してみましたが、エラー表示となり、うまくいきませんでした。 現在の表示の最後尾に追記する形で、"best_ask"のみが追記されるようにしてみたいと思っております。 よろしくお願いいたします。
fuzzball

2017/06/30 00:16 編集

エラー内容を教えて下さい。 print(type(of: json))の出力結果も教えて下さい。 位置はprint(json)の次でかまいません。
fuzzball

2017/06/30 01:00

回答に追記しましたので、試してみて、ダメなら上の書き込みに対応して下さい。
takaswy

2017/08/01 14:24

迅速な回答をありがとうございました。 SWIFT自体が理解できておりませんで、質問の動作確認までに更に時間がかかってしまいました。 // BestAskを返す func getBestAsk(_ data: Data) -> Int { do { let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String: Any] let best_ask = (json["best_ask"] as! NSNumber).intValue rate.bestAsk = best_ask } catch { print("parse error!") } return rate.bestAsk } のように関数化して、呼び出すことでうまく動作するようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問