2016-04-05 10 views
1

SwiftとJSONを初めて使用していて、問題が発生しています。私はすべての種類のQ & Aを見て、アドバイスを取り入れようとしましたが、正しく行っていません。Swift JSONのシリアル化エラー

私は、JSONリントチェッカー(http://jsonlint.com)に従ってOKのJSONを生成しています。ブラウザを使用して

は、応答はこれです:

[{ "郵便番号": "NW4 2JL"}、{ "郵便番号": "NW4 2ES"}、{ "郵便番号": "NW4 3XP"} 、{"PostalCode": "NW4 2DH"}、{"PostalCode": "NW4 2HD"}、{"PostalCode": "NW4 2HD"}、{"PostalCode": "NW4 2DX"}]

Xcode ([PostalCode ":" NW4 2JL "}、{" PostalCode ":" NW4 2ES "}、{" PostalCode "}、JSONを解析できませんでした。 {NW4 2DH}}、{"NW4 2DH"}、{"NW4 2DH"}、{NW4 2DH} ])

私には何の不満があり、それについての説明はありません。「Optional()」部分です。その前に、エラー文は私が12行目(「sorry」という単語を含む唯一のメッセージ)に書いたものです。 '()'内のJSONは正常に見えます。

私はここで間違ったやり方を教えてもらえますか、または「オプション()」テキストがどこから来ているのでしょうか?

これは私のコードの関連部分である:この行では

let task = session.dataTaskWithRequest(request) { data, response, error in 
     guard data != nil else { 
      print("no data found: \(error)") 
      return 
     } 
     do { 
      if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? NSDictionary { 
       let success = json["success"] as? Int 
       print("Success: \(success)") 
      } else { 
       let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
       print("Error, sorry, could not parse JSON: \(jsonStr)") 
      } 
     } catch let parseError { 
      print(parseError) 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Error could not parse JSON: '\(jsonStr)'") 
     } 
    } 
+0

@ Eric D:オプションも一時的である可能性があります。彼らはスマートではないので、逆互換性の理由からではありません。 –

+0

@IanBellオプションはスウィフトの重要なコンセプトで、Chris Lattnerはこれを何度も言っています。彼らはすぐにどこにも行かない。 :) – Moritz

+0

うわーこのサイトはいいです。私がこれを投稿するとすぐに、私は答えを他のところで見つけました(http://stackoverflow.com/questions/8356842/how-to-use-nsjsonserialization)。本当に申し訳ありません。ソリューションはNSDictionaryの代わりにNSArrayを使用することでした。なぜなら、応答は配列だったからです。 – Denis

答えて

0

let success = json["success"] as? Int 

あなたはオプションsuccessを作っています。オプションはプロトコルCustomStringConvertibleに準拠しているため、「オプション(...)」が文字列として取得されます。

オプションが何であるかわからない場合は、すべてを停止してください。となってください。今。 ;)

完了? [OK]をクリックして、オプションのバインドなどのオプションの安全なラップを実行します。

if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary { 
    if let success = json["success"] as? Int { 
     print("Success: \(success)") 
    } 
} 

それだけです。それはあなたが実際に持っているもの少し不明だ:ここで私たちは辞書にアクセスしているが、あなたの質問にJSONは、辞書の配列であることを

注意。

関連する問題