2016-09-09 5 views
0

Swiftを習得しようとしています。私のプロジェクトの1つは、内部Webサービス(Python CGIスクリプトのグループ)からJSONデータを取得し、それをSwiftオブジェクトに変換しようとすることです。私はこれをPythonで簡単に行うことができますが、私はSwiftでこれを行うのに問題があります。ここに私の遊び場コードは次のとおりです。SwiftでJSONをデータに変換する際に問題が発生しました

import UIKit 

import XCPlayground 

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true 

let endpoint: String = "http://pathToCgiScript/cgiScript.py" 
let url = NSURL(string: endpoint) 
let urlrequest = NSMutableURLRequest(URL: url!) 
let headers: NSDictionary = ["User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)", 
"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"] 
urlrequest.allHTTPHeaderFields = headers as? [String : String] 
urlrequest.HTTPMethod = "POST" 

let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
let session = NSURLSession(configuration: config) 
let task = session.dataTaskWithRequest(urlrequest) { 
    (data, response, error) in 
    guard data != nil else { 
     print("Error: did not receive data") 
     return 
    } 
    guard error == nil else { 
     print("Error calling script!") 
     print(error) 
     return 
    } 
    do { 
     guard let received = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? 
     [String: AnyObject] else { 
      print("Could not get JSON from stream") 
      return 
     } 
     print(received) 

    } catch { 
     print("error parsing response from POST") 
    } 
} 
task.resume() 

私は、データを取得するために、「POST」を作ることは奇妙に見えるかもしれ知っているが、それはシステムの設定方法です。私が取得し続ける:

Could not get data from JSON 

私は応答をチェックし、ステータスが、私は、その後でデータの説明を確認200です:私は、予期しない結果を得た

print(data?.description) 

。ここにスニペットがあります:

Optional("<0d0a5b7b 22535441 54555322 3a202244 6f6e6522 2c202242 55535922... 

私はミラーを使用しました。明らかにそのタイプはNSDataです。これをどうしたらいいか分からない。私はbase64EncodedDataWithOptionsでデータをエンコードしようとしました。私は別のNSJSONReadingOptionsも無駄にしようとしました。何か案は?

更新:

私がプレイグラウンドでコードをダブルチェックするためにWiresharkのを使用しました。電話が正しく行われただけでなく、返信されるデータも正しいです。実際、WiresharkはデータをJSONと見なしています。この問題は、JSONデータをSwiftオブジェクトに変換しようとしています。

+0

JSONは問題の可能性がある 'CRLF'(0x0D0A)で始まります – vadian

答えて

0

私は何が間違っているかを考え出しました。私は間違ったタイプにキャストしていた。これは新しいコードです:

guard let received = try! NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) as? [AnyObject] 

JSONは辞書の配列ではなくオブジェクトの配列を返していました。

関連する問題