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 这里是打印 - 可选( URL: midlandgates.co.uk/JSON/reliveCacheData.json 状态代码:200, headers "Accept-Ranges" = bytes; "Content-Length" = 4596;“内容类型”=“应用程序/json”;日期=“格林威治标准时间 2015 年 12 月 30 日星期三 19:07:26”;Etag =“\”11f4-528216d0e395b\“”;“最后修改”=“格林威治标准时间 2015 年 12 月 30 日星期三 18:08:32”;服务器 =“Apache/2.4.16 (Unix)”; ) 所以你有一个状态码 200 这意味着你应该有数据,现在在同一个地方打印你的数据对象。 print(data) - 如果你看到几个数字块,那么你就得到了你的数据。 我得到了很多我认为是数据的可选数字 【参考方案1】:

(注意: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 数据

多个网站的多个 Alamofire 请求的正确模型

如何在 Swift 中从 alamofire 中提取数据? [复制]

使用 Alamofire 请求方法在 POST 的请求正文中发送 JSON 对象数组

请求失败时从 AlamoFire 获取 JSON 响应

JSON:使用 Alamofire 和 Swift 3 提取数据