2016-04-09 21 views
0

私はすぐに学び始めました。それは迅速に来るならば、私はnoobです。それを試して練習するために、私はiosの食料雑貨のアプリケーションを作ろうとしています。しかし、今ではおそらく、最も基本的なもののうちの1つに取り組んでいます。標準のスウィフトコードだけでライブラリを使用せずにJSONオブジェクトをシリアライズしています。だから私の質問は、私がAPIから得たデータをシリアライズすることで私の問題を解決するのを助けることができます。SwiftでJSONをシリアル化しようとするとエラーが発生するのはなぜですか?

私はpostmanを使用して、どのような応答を私がapiから得るのかチェックしています。

私の迅速なコードで
[ 
    { 
    "id": 1, 
    "name": "Regular List" 
    }, 
    { 
    "id": 2, 
    "name": "List for diner" 
    }, 
    { 
    "id": 3, 
    "name": "List 3" 
    }, 
    { 
    "id": 4, 
    "name": "List for next week" 
    }, 
    { 
    "id": 6, 
    "name": "Test name" 
    } 
] 

私はこれを行うことによって、この応答を取得しようとしています:私は、APIを取得ないとき、これは私が得る応答である

func getBoodschapListJSON(){ 
     let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
     let userId = prefs.integerForKey("UserId") 
     let requestUrl = NSURL(string: "http://localhost:8080/api/lists/user/id/\(userId)")! 
     let session = NSURLSession.sharedSession() 

     let request = NSMutableURLRequest(URL: requestUrl) 
     request.HTTPMethod = "GET" 
     request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") 

     session.dataTaskWithRequest(request, completionHandler: { (data, response, error) in 

       do { 
        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 

        //Here comes some code to try and process the JSON object in the table View. 
       } catch { 
        print("error serializing JSON: \(error)") 
       } 

     }).resume() 
    } 

しかし、私は有効になったことはありません私はエラーで終わる応答: :キャラクターの周りに「エラーシリアライズJSONエラードメイン= NSCocoaErrorDomainコード= 3840 『無効な値0』のUserInfoは= {文字の周りNSDebugDescription =無効な値が0}」

私はそれことを期待しますJSONが適切ではないことと関係がありますNSJSONSerializationがそれを解釈できるようにしてください。しかし、私は確信していません、私はいくつかのスタックオーバーフローの投稿を見ている私と同じ質問があった。彼らのほとんどは.AllowFragmentsを使用すると言いましたが、それは私のエラーを解決しませんでした。

私のコードでこのエラーを修正できるように誰も私を助けることが親切だろうか?

+0

サーバーからのjsonの形式が正しいかどうかを確認してください。 jsonlint.comやその他のjsonバリデーターでも同じことを確認できます。 –

+0

@ArunGupta jsonlint.comでチェックしたところ、有効なjsonです。 "NSJSONSerialization.JSONObjectWithData(data!、options:.AllowFragments)"を試してみると、apiから返されたjsonをインタプリタできます。私は正しいパラメータを使用したと思っていますが、エラーが発生しやすいように私はnoobです。 – user3473161

+0

「セットアップ」フォルダとAPIのコードを投稿できますか? – ntoonio

答えて

0

あなたのURLはちょっと変わっていますが、そのように動作する可能性はまだあります。ブラウザのURLにアクセスしてみてください(userIdのIDを設定してください)。そうであれば、APIのコードにhtmlがないことを確認してください。例えば、あなたが使用しているメタタグはありません。

これが機能しない場合は、おそらくコードです。鉱山をお試しください:

let urlAsString = "http://localhost:8080/api/lists/user/id/\(userId)" 
do { 
    let jsonDict: NSDictionary = try NSJSONSerialization.JSONObjectWithData(NSData(contentsOfURL: NSURL(string: urlString)!)!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 
    print (jsonDict) 
} 
catch { 
    print ("Couldn't get JSON... \(error)") 
} 
+0

アドバイスをいただきありがとうございます。私は本当にそれを数回チェックしたのでURLにすることはできないと思った。今私はブラウザでそれをチェックし、私は応答を得ていないことに気づいた。私はそれが私に起こったときに私はそれが嫌い、まだそこにエラーがあったと思う。私は本当にコードが間違っていると思ったが、結局それはURLだった。しかし、今私は、コードはあなたのものか、私のものが良いのだろうか?どちらも現在動作しており、ベストプラクティスを使用したいと考えています。 – user3473161

+0

@ user3473161私には分かりませんが、大きな違いはないと思います。私のバージョンを使ってくれた私にとっては、私の方が簡単だと思います。あなたが望むものを選んでください! :) – ntoonio

+0

@ user3473161新しいJSONコードが見つかりました。はるかに短く複雑ではありません。私はこの1つが最高だと確信しています – ntoonio

0

使用JSON配列そのNSDictionaryのにこの配列に変換し、その値を使用した後

let data = NSData(contentsOfURL: NSURL(string: "your URL")!) 


     let jsonArray: NSArray = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray 

を取得するには、このシンプルなコード...辞書に変換するためのサンプルは

let cell = tableView.dequeueReusableCellWithIdentifier("atCell")! as UITableViewCell 

     let maindata = (data[indexPath.row] as! NSDictionary) 
     cell.textLabel?.text = maindata["date"] as? String 
です

psテーブルビューを使用してデータを表示しました...

関連する問題