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

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

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

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

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Swift

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

Q&A

解決済

1回答

831閲覧

JSONデータ?からデータを取り出せない

hazata

総合スコア13

JSON

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

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Swift

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

0グッド

0クリップ

投稿2020/02/29 07:12

編集2020/03/01 09:58

swift5で下記のようなコードで実行したところ、コンソールにはJSONらしきデータが表示されたのですが、そのデータを取り出そうとするとnilが返されます。

swift5

1import UIKit 2import Foundation 3import SwiftyJSON 4 5extension URLSessionWebSocketTask.Message { 6 var prettyPrintedJSONString: NSString? { 7 switch self { 8 case .string(let text): 9 guard let object = try? JSONSerialization.jsonObject(with: text.data(using: .utf8)!, options: []), 10 let data = try? JSONSerialization.data(withJSONObject: object, options: [.prettyPrinted]), 11 let prettyPrintedString = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) else { return nil } 12 return prettyPrintedString as NSString 13 default: 14 return nil 15 } 16 } 17} 18 19 20 21class ViewController: UIViewController { 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 26 getmessage() 27 28 } 29 30 func getmessage() { 31 32 let url = URL(string: "wss://www.bitmex.com/realtime")! 33 34 let urlSession = URLSession(configuration: .default) 35 let webSocketTask = urlSession.webSocketTask(with: url) 36 webSocketTask.resume() 37 38 39 webSocketTask.receive { result in 40 switch result { 41 case .failure(let error): 42 print(error) 43 case .success(let message): 44 45 print("message : (message.prettyPrintedJSONString!)") 46 47 let jsondata = JSON(message) 48 49 print("jsondata : (jsondata["info"].string)") 50 51 } 52 } 53 } 54} 55 56

responce

1message : { 2 "limit" : { 3 "remaining" : 39 4 }, 5 "info" : "Welcome to the BitMEX Realtime API.", 6 "timestamp" : "2020-02-29T06:59:52.631Z", 7 "docs" : "https://www.bitmex.com/app/wsAPI", 8 "version" : "2020-02-25T22:10:40.000Z" 9} 10 11jsondata : nil

messageではきちんとデータを取得できていると思うのですが、色々やってみてもnilが帰ってきてしまいます。"Welcome to the BitMEX Realtime API." という文字列を取得したいです。
よろしくお願いいたします。

環境
Xcode Version 11.3.1
Swift 5
使用ライブラリ SwiftyJSON

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

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

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

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

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

guest

回答1

0

ベストアンサー

この部分ですが、
・message は enum なので、prettyPrintedJSONString でやってるように、中身を取り出す必要があります。
・SwiftyJSON で JSON 文字列をパースする場合、JSON(parseJSON:) を使う必要があります。

swift

1 let jsondata = JSON(message) 2 3 print("jsondata : (jsondata["info"].string)")

たとえばこんな感じ。

swift

1 if case .string(let text) = message { 2 let jsondata = JSON(parseJSON: text) 3 print("jsondata : (jsondata["info"].string)") 4 }

実行結果

jsondata : Optional("Welcome to the BitMEX Realtime API.")

投稿2020/03/02 19:14

hoshi-takanori

総合スコア7895

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

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

hazata

2020/03/03 01:26

教えていただいたコードでJSONデータを取得することができました!ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問