Alamofire JSON 请求未从服务器中提取数据
Posted
技术标签:
【中文标题】Alamofire JSON 请求未从服务器中提取数据【英文标题】:Alamofire JSON Request not pulling the data from a server 【发布时间】:2015-12-30 18:50:13 【问题描述】:我正在使用 Alamofire 从服务器 (http://midlandgates.co.uk/JSON/reliveCacheData.json) 中提取 JSON 文件。为此,我有一个 Alamofire 请求函数,它应该将数据拉下来并将其写入一个名为 JSONDataClass
的类。
Alamofire 请求
Alamofire.request(.GET, "http://midlandgates.co.uk/JSON/reliveCacheData.json")
.response request, response, data, error in
if let data = data
let json = JSON(data:data)
for locationData in json
let locationDataJSON = JSONDataClass(json: locationData.1)
self.cacheData.append(locationDataJSON)
for title in self.cacheData
print(title.memoryTitle)
但是我的 printLn 没有打印 JSON 文件中的数据,这表明请求或类存在问题。但是我是 swift 新手,似乎无法解决问题,感谢所有帮助!
类
import Foundation
import CoreLocation
import SwiftyJSON
class JSONDataClass
//Location MetaData
var postUser: String!
var memoryTitle: String!
var memoryDescription: String!
var memoryType: String!
var memoryEmotion: String!
var taggedFriends: String!
//Location LocationalData
var memoryLocation: CLLocationCoordinate2D
//MultiMedia AddressData
var media1: String!
var media2: String!
var media3: String!
var media4: String!
var media5: String!
//Writing to varibles
init(json: JSON)
postUser = json["user"].stringValue
memoryTitle = json["title"].stringValue
memoryDescription = json["description"].stringValue
memoryType = json["type"].stringValue
memoryEmotion = json["emotion"].stringValue
taggedFriends = json["friends"].stringValue
memoryLocation = CLLocationCoordinate2D(latitude: json["latitude"].doubleValue, longitude: json["longitude"].doubleValue)
media1 = json["media1"].stringValue
media2 = json["media2"].stringValue
media3 = json["media3"].stringValue
media4 = json["media4"].stringValue
media5 = json["media5"].stringValue
【问题讨论】:
在您的 Alamofire 调用中,就在您的 if-let 数据语句上方。添加 print(response) 并查看您的服务器响应是什么。这将有助于表明问题所在。 另外,ios 9 引入了 App Transport Security 你禁用了吗? @DanBeaulieu 这里是打印 - 可选((注意:JSON 内容的作者已根据我的回答修复了他的 JSON - 我的回答在本文发布时是正确的)。
问题是您从服务器返回的 JSON 无效。
我将您的 SwiftyJSON 代码换掉,并将其包装在一个 try-catch 中,这说明了问题:
Alamofire.request(.GET, "http://midlandgates.co.uk/JSON/reliveCacheData.json")
.response request, response, data, error in
//print("status \(response)")
do
let myData = try NSJSONSerialization.JSONObjectWithData(data!,
options: .MutableLeaves)
print(myData)
catch let error
print(error)
我收到以下错误:
2015-12-30 13:47:06.129 ignore[10185:2174510] Interface Builder 文件中的未知类日志。 错误域 = NSCocoaErrorDomain 代码 = 3840“字符 961 周围未转义的控制字符。” UserInfo=NSDebugDescription=周围未转义的控制字符 字符 961.
此错误基本上意味着您从服务器返回的 JSON 无效。
通过 JSONLint 运行确保您的 json 有效:
http://jsonlint.com
【讨论】:
它说的是“状态失败”,但是我已经复制并粘贴了上面的代码,当你说“打印出你的值”时,我是不是要添加任何东西? @MattHammond 更新,这是您接下来应该检查的内容 我在日志中得到空值 @MattHammond 已更新,我可能会在此之后继续,但希望您了解如何使用打印语句进行调试 是的,看看 print 是如何让你知道它为什么坏的,这真的很有趣,但是我仍然得到 null【参考方案2】:您是调试器和断点的新手吗?
在您的响应闭包中设置一个断点(例如,在您的if let data = data
行中)并单步执行您的代码以查看它是否在每个阶段都符合您的预期。也许error
已设置?也许if let data = data
条件失败(你没有在else
中做任何事情来记录失败,所以你怎么知道?)...
【讨论】:
对不起,我是 swift 和 Xcode 的新手,你是什么意思? 您需要阅读有关使用断点和调试器的 Xcode 文档。断点会在您设置的任何位置暂停程序的执行(单击代码左侧的间距时出现的蓝色标记)并显示调试器在该行暂停,以便您可以单步执行并检查代码的状态运行。这不是 Swift / Xcode 特有的。这是非常基本的编程知识,你无法不了解就成功。 这是一段来自 Apple 的关于使用 Xcode 进行调试的视频:developer.apple.com/videos/play/wwdc2012-412 是的,我是 swift 断点的新手,真正开始和关闭 swift 最多只学习了几周,没想到我做的任何事情都足够复杂,无法真正利用断点和调试器 任何时候出现问题,调试器都是你的朋友。它是 的首选工具。我花在这上面的时间几乎和我写代码的时间一样多。 (这很正常。)HUGE 帮自己一个忙,让学习断点和调试器基础知识成为您的首要任务。你会如此高兴你这样做了。这真的没有那么难,而且回报远远超过学习它所花费的时间。【参考方案3】:在我检查了讨论和服务器提供的数据链接后,我可以说,你的问题是如何处理你的 JSON(类,或结构,或枚举??)
您是否按照 SwiftyJSON 的一些教程进行操作?虽然您在 JSONDataClass 类中的 init(json: JSON) 似乎接受了一些 JSON 对象(又名字典),但实际上您的 json 是一个 JSON 数组!检查 SwiftyJSON 文档并记下您的帐户,您收到了一个数组。
试试这个:
for d in json
let locationDataJSON = JSONDataClass(json: d)
self.cacheData.append(locationDataJSON)
你看,locationDataJSON 不是位置数据,而是接收到的数组中的一个 json 对象。或者只是删除 locationData.1 中的 .1
例如:
Alamofire.request(.GET, "http://midlandgates.co.uk/JSON/reliveCacheData.json")
.response request, response, data, error in
if let data = data
let json = JSON(data:data)
for locationData in json
let locationDataJSON = JSONDataClass(json: locationData)
self.cacheData.append(locationDataJSON)
for title in self.cacheData
print(title.memoryTitle)
【讨论】:
您可能想要添加某种解释,说明您所做的更改以及如何解决问题。我们已经得出结论,服务器上的 JSON 无效。 作者根据我的回答修复了他的 JSON @DanBeaulieu 我认为您的回答没有任何问题,一般来说,我认为我们都在努力互相帮助。 我已将您的 cmets 移至您的问题。这可以提高您帖子的整体质量,使其成为更好的投票候选人。 @DanBeaulieu 谢谢!我对 SwiftyJSON 没有任何了解,我使用自己的 JSON 解析器/序列化器,但我很确定 JSON() 的结果不是元组,并且 JSONDataClass 接受 json 对象作为其 init 的参数。所以我希望它可以帮助这个人继续他的项目。以上是关于Alamofire JSON 请求未从服务器中提取数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift Alamofire 从 SOAP 中提取 JSON 数据
如何在 Swift 中从 alamofire 中提取数据? [复制]