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

所以我有这个对象:

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"
       }
    ]
 }

【问题讨论】:

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

标签: ios swift


【解决方案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 之后我无法使用该消息。问题是从数组中的对象添加数据。
  • 我明白这一点,但您提供的代码没有任何可能导致您看到的问题。这就是为什么拥有完整的项目代码将有助于弄清楚发生了什么......
  • 查看我刚刚添加到答案中的代码。如果你把它放在操场上,它就可以了。因此,您只需对其进行修改,即可进行您需要进行的任何其他更改。
  • 您只需引用对象实例的相关属性即可。例如,使用let msg = messagesSet[0] 从数组中获取Messages 的一个实例,然后使用msg.text 获取text 属性,使用msg.id 获取id 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
相关资源
最近更新 更多