Alamofire JSON请求不从服务器提取数据

时间:2015-12-30 18:50:13

标签: ios json swift swift2 alamofire

我正在使用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
    }
}

3 个答案:

答案 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有效:

http://jsonlint.com

答案 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)
            }
        }

}