我正在使用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
}
}
答案 0 :(得分:3)
(注意: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有效:
答案 1 :(得分:2)
您是调试器和断点的新手吗?
在响应闭包中设置断点(例如,在if let data = data {
行中)并逐步执行代码,看看它是否符合您在每个阶段的预期。可能error
已设定?也许if let data = data {
条件失败了(你在else
没有做任何事情来记录失败,所以你怎么知道?)......
答案 2 :(得分:2)
在我检查了讨论和服务器提供的数据之后,我可以说,你的麻烦是如何处理你的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)
}
}
}