2017-03-22 2 views
0

は、だから私は、このオブジェクト持っている:URLSessionを使用して解析し、S​​wiftの配列でそれらをインポートするにはどうすればよいですか?

class Messages: NSObject { 
    var id: String? 
    var date: String? 
    var text: String? 
} 

をそして私はURLSessionを使用してデータを解析していますし、私はそれにメッセージを追加するための配列を作成します。問題は、私がmessages.idまたはmessages.textを印刷するときです。データを見ることができますが、配列にそれらを追加すると:messagesSet = [Messages]()と、配列のテキストを印刷すると、[]のようなものになります。ここで

は、データを解析するためのコードです:

//Initiate Getting Messages 
func getMessages(url: URL, completion: @escaping DownloadComplete) { 
    let dataTask = URLSession.shared.dataTask(with: url) { 
     (data, response, error) in 
     self.didFetchMessages(data: data, response: response!, error: error, completion: completion) 
    } 
    dataTask.resume() 
} 

//Callback for URLSession for getMessages 
private func didFetchMessages(data: Data?, response: URLResponse, error: Error?, completion: @escaping DownloadComplete) { 
    do { 
     let jsonData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String: Any] 
     guard let messageList = jsonData["messages"] as? [Any] else { 
      completion(nil, false) 
      return 
     } 
     for messageInfo in messageList { 
      let message = Messages() 

      guard let info = messageInfo as? [String:Any] else { 
       completion(nil, false) 
       return 
      } 
      if let id = info["id"] as? String { 
       message.id = id 
      } 
      if let date = info["date"] as? String { 
       message.date = date 
      } 
      if let text = info["text"] as? String { 
       message.text = text 
      } 
      messagesSet.append(message) 
      print(messagesSet) 
     } 
     completion(messagesSet, true) 
    } catch let error { 
     print("Decoding error \(error)") 
    } 
} 

は..私はこの情報がこの問題の解決策を見つけるために十分であることを望むあなたの助けをいただき、ありがとうございます。ここで

はJSONレスポンスです:

{ 
    "messages": [ 
     { 
      "id": "4323", 
      "date": "07/01/17 23:22", 
      "text": "This is a test message" 
     }, 
     { 
      "id": "4324", 
      "date": "07/01/17 23:23", 
      "text": "This is a test message 2" 
     }, 
     { 
      "id": "4326", 
      "date": "07/01/17 23:25", 
      "text": "This is a test message3" 
     } 
    ] 
} 
+0

解析するJSONファイルのサンプルを含めることができますか?さらに良い点は、その問題を示す遊び場です。 – kevin

+0

http://stackoverflow.com/questions/41734982/parsing-nested-array-of-dictionaries-using-object-mapper/41735194#41735194 JSONの解析は何千もの質問で言及されています –

+0

@kkoltzauあなたはJSONファイルも持っています – Pavlos

答えて

1

更新として、遊び場で実行することができ、次のコードは、元のコードが正常に動作することを示しています

class Messages: NSObject { 
    var id: String? 
    var date: String? 
    var text: String? 
} 

var messagesSet = [Messages]() 
let str = "{\"messages\": [{\"id\": \"4323\", \"date\": \"07/01/17 23:22\",\"text\": \"This is a test message\"}, {\"id\": \"4324\", \"date\": \"07/01/17 23:23\", \"text\": \"This is a test message 2\"}, {\"id\": \"4326\", \"date\": \"07/01/17 23:25\", \"text\": \"This is a test message3\"}]}" 
let data = str.data(using:String.Encoding.utf8) 
do { 
    let jsonData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String: Any] 
    if let messageList = jsonData["messages"] as? [Any] { 
     for messageInfo in messageList { 
      let message = Messages() 
      if let info = messageInfo as? [String:Any] { 
       if let id = info["id"] as? String { 
        message.id = id 
       } 
       if let date = info["date"] as? String { 
        message.date = date 
       } 
       if let text = info["text"] as? String { 
        message.text = text 
       } 
       messagesSet.append(message) 
       messagesSet 
      } else { 
       NSLog("Failed to get message info dicgtionary") 
      } 
     } 
     NSLog("Completed with data: \(messagesSet.count)") 
    } else { 
     NSLog("Failed to get messages") 
    } 
} catch let error { 
    print("Decoding error \(error)") 
} 

問題、私が知る限りでは(何が起こったかに興味がある人には)、OPは、Messagesオブジェクトを印刷できないということはコードの問題であるとOPが考えていたということです。次のようにそれは単純に(それがNSObjectのサブクラスであるため)Messagesオブジェクトのdescriptionプロパティをオーバーライドして固定することができに対し:

class Messages: NSObject { 
    var id: String? 
    var date: String? 
    var text: String? 

    override var description: String { 
     return "Message: ID - \(id), Content - \(text)" 
    } 
} 

これは単に興味があるかもしれない他の誰の参照用です。

+0

問題はif文で私はmessage.textを出力してメッセージを得ることができます。しかし、メッセージセットにメッセージを追加するとそれ以降のメッセージは使用できません。 問題はアレイ内のオブジェクトからデータを追加することです。 – Pavlos

+0

私はそれを理解していますが、あなたが提供したコードには、あなたが見ているものを引き起こす可能性のある問題はありません。だから、完全なプロジェクトコードを持っていると、何が起こっているのか把握するのに役立ちます。 – Fahim

+0

ok私はあなたのために遊び場ファイルを作成しています – Pavlos

関連する問題