如何使用 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.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 文件?更好的是,一个展示问题的游乐场。 ***.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的数据请求和数据处理