如何使用 URLSession 解析并将它们导入 Swift 的数组中?

Posted

技术标签:

【中文标题】如何使用 URLSession 解析并将它们导入 Swift 的数组中?【英文标题】:How can I parse using URLSession and import them in an array in Swift? 【发布时间】:2017-03-22 03:31:06 【问题描述】:

所以我有这个对象:

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

我正在使用 URLSession 解析数据,然后我想创建一个数组来在其中添加消息。问题是当我打印 messages.idmessages.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"
       
    ]
 

【问题讨论】:

能否包含一个您正在解析的示例 JSON 文件?更好的是,一个展示问题的游乐场。 ***.com/questions/41734982/…JSON Parsing 被千题提及 @kkoltzau 你也得到了 JSON 文件 @UmairAfzal 这对我没有帮助:/ @PavlosNicolaou 请检查我的回答 【参考方案1】:

作为更新,以下可在 Playground 中运行的代码证明原始代码运行良好:

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 对象是由于代码问题。而可以通过覆盖Messages 对象的description 属性(因为它是NSObject 的子类)来简单地修复它,如下所示:

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

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

仅供有兴趣的朋友参考。

【讨论】:

问题是在 if 语句中我可以打印 message.text 并获取消息.. 但是当我将消息附加到 messagesSet 之后我无法使用该消息。问题是从数组中的对象添加数据。 我明白这一点,但您提供的代码没有任何可能导致您看到的问题。这就是为什么拥有完整的项目代码将有助于弄清楚发生了什么...... 查看我刚刚添加到答案中的代码。如果你把它放在操场上,它就可以了。因此,您只需对其进行修改,即可进行您需要进行的任何其他更改。 here is the playground I added in github 您只需引用对象实例的相关属性即可。例如,使用let msg = messagesSet[0] 从数组中获取Messages 的一个实例,然后使用msg.text 获取text 属性,使用msg.id 获取id 属性。

以上是关于如何使用 URLSession 解析并将它们导入 Swift 的数组中?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift之深入解析URLSession的数据请求和数据处理

如何解决使用 URL Session 获取数据的问题?

如何在 Swift 中使用 URLSession 缓存图像

在后台线程问题中将服务器数据保存到核心数据

Swift:如何在异步 urlsession 函数中返回一个值?

Swift:如何在异步 urlsession 函数中返回一个值?