2017-06-19 13 views
0

ここでは他の多くの質問を見てきましたが、まだSwiftには比較的新しいので、私が持っている文脈にそれらの回答を置くのは難しいです。SwiftでJSONオブジェクトを使用してテーブルビューを作成する

私はイベントのデータベースを持っており、上記のイベントをテーブルビューに取り込みたいと思います。私の「EventTableViewController」は私には、以下の機能を持っている:

func HTTPRequestListEvent() { 
    let serverURL = NSURL(string: "http://localhost:8888/public_php/Cake/index.php/event/listevent") 
    let request = NSMutableURLRequest(url:serverURL! as URL) 
    request.httpMethod = "POST" 

    //Create a task to send the post request 
    let task = URLSession.shared.dataTask(with: request as URLRequest) { 
     data, response, error in 

     if error != nil { 
      print("HTTPRequestError1=\(error)") 
      return 
     } 

     do { 
      if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
       print("1") 
       for (_, value) in json { 
        if let eventItem = value as? [String:AnyObject] { 
         if let eventName = eventItem["EventName"] as? String { 
          print(eventName) 
         } 
         if let eventLocation = eventItem["EventLocation"] as? String { 
          print(eventLocation) 
         } 
        } 
       } 
      } 
     } 
     catch { 
      print("HTTPRequestError2=\(error)") 
     } 
    } 
    task.resume() 
} 

しかし、私は、JSONのシリアル化が機能するように見えることはできません。それは私に間違いを与えているわけでもなく、「1」を印刷していることさえありません。

また、私は 'print(eventName)'と言っているのではありませんが、これまでのところすべてです。私は何をしたいような何かをすることです:

cell.eventNameLabel.text = eventName 

が、私は、この文脈では、セルの詳細を取得するかどうかはわかりません。

編集:JSONは他の場所でも動作しましたが、特異なデータの場合はログインしてユーザーを登録できました。郵便配達で

、私は私のサーバーから次のようなJSONデータを取得:

[{ "EVENTNAME": "壮大ソワールé E"、 "EventLocation": "ホットタブシネマ"、 "開始日": "2017 "イベント名": "魅力的なパーティ"、 "イベントの場所": "ガゼボ"、 "開始日": "2017-12-02"}、{"イベント名": "魔法のイベント"、 "EventLocation ":"虹の終わり "、" StartDate ":" 2017-02-03 "}、{" EventName ":"少しゴミ収集 "、" EventLocation ":" Dungeon "、" StartDate ":" 2090-01 -04 "}]

+1

ほとんどの場合、JSONは辞書ではありません。 – rmaddy

+0

JSONのサンプルを追加できますか? –

+0

@rmaddy素人の言葉ではどういう意味ですか、その情報はどうしたらいいですか? – Weirdali

答えて

0

最初のものが最初です。あなたのprint("1")がうまくいかない理由はとても簡単です。値をアンラップするためにif letを使用しています。値がヌルの場合、if letのコードはスキップされます。あなたのコードではif letelseを追加して印刷してください。それが印刷されます。

今質問に戻ってください。 if letが機能しない理由は、JSON文字列をキャストする方法です。 JSON文字列を見ると、最上位に配列があります。あなたのコードでは、結果を[String:AnyObject]という辞書にキャストしています。したがって、このキャストに失敗したため、結果としてnullが返されます。問題を解決するには、コードの実例を次に示します。

let str = "[{\"EventName\":\"Magnificent soirée\",\"EventLocation\":\"Hot tub cinema\",\"StartDate\":\"2017-12-01\"},{\"EventName\":\"Splendid party\",\"EventLocation\":\"Gazeebo\",\"StartDate\":\"2017-12-02\"},{\"EventName\":\"Magical event\",\"EventLocation\":\"The end of a rainbow\",\"StartDate\":\"2017-02-03\"},{\"EventName\":\"Slightly rubbish gathering\",\"EventLocation\":\"Dungeon\",\"StartDate\":\"2090-01-04\"}]" 

do { 
    let data = str.data(using: .utf8) 
    if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [Dictionary<String, Any>] { 
     print("1") 
     for oneItemInJsonArray in json { 
      if let eventName = oneItemInJsonArray["EventName"] as? String { 
       print(eventName) 
      } 
      if let eventLocation = oneItemInJsonArray["EventLocation"] as? String { 
       print(eventLocation) 
      } 
     } 
    }else{ 
     print("fail") 
    } 
} 
catch { 
    print("HTTPRequestError2=\(error)") 
} 
関連する問題