如何使用 Swift 2 + XCode 7 + iOS 9 获取和解析 JSON [重复]

Posted

技术标签:

【中文标题】如何使用 Swift 2 + XCode 7 + iOS 9 获取和解析 JSON [重复]【英文标题】:How To Fetch and Parse JSON Using Swift 2 + XCode 7 + iOS 9 [duplicate] 【发布时间】:2015-10-10 16:41:01 【问题描述】:

一直在寻找有关 Swift 2 和 ios 9 网络的有用教程,但该主题似乎没有在线内容。我已经观看了 WWDC 会话 Networking with NSURLSession 但我无法调整 iOS9 的新 API 以采用异步方式来获取和解析 JSON 数据。我尝试过的:

    do 
        if let url = NSURL(string: "site/api.php?option=fetchOps"),
            let data = NSData(contentsOfURL: url),
            let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [[String:AnyObject]] 

        
     catch let error as NSError 
        print(error.description)
    

请分享您在 iOS9 和 Swift2 上的网络经验,任何最佳实践可能是用于网络和解析的 Singleton 类,可能是 ORM?

【问题讨论】:

1.您的网址无效。 2.您正在同步获取它。请改用 NSURLSession。 SO 或网络上的其他地方有很多问答。 是[***.com/questions/31805045/…在swift2.0中使用NSURLSession)异步解析JSON的解决方案吗? 是的it is。 @EricD。如果我想以块回调的形式获得结果怎么办?如何更改重复建议中所述的解决方案 【参考方案1】:

为您提出请求的简单方法:

How to make an HTTP request in Swift?

或者如果您想自己发送请求:

HTTP POST error Handling in Swift 2

将字符串转换为 JSON 对象:

作为一个例子,这里我已经转换了一个 NSString

首先将 NSString 转换为 NSDictionary

static func convert(src: NSString) -> NSDictionary 
    // convert String to NSData
    let data = src.dataUsingEncoding(NSUTF8StringEncoding)
    var error: NSError?

    // convert NSData to 'AnyObject'
    let anyObj: AnyObject?
    do 
        anyObj = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(rawValue: 0))
     catch let error1 as NSError 
        error = error1
        anyObj = nil
    

    if(error != nil) 
        // If there is an error parsing JSON, print it to the console
        print("JSON Error \(error!.localizedDescription)")
        //self.showError()
        return NSDictionary()
     else 

        return anyObj as! NSDictionary
    


然后,像这样使用它

if  let name = dictionary["name"] as? String 
    self.name = name

您可以使用转换后的 JSON 来制作这样的对象

import Foundation

class Student 
var name="";

init(dictionary: NSDictionary) 
    let _NAME = "name"
    if  let name = dictionary[_NAME] as? String 
        self.name = name
    



【讨论】:

为什么 PO 应该使用 3rd-party 库来完成简单的数据任务? 如果你想自己做,看看这个:: ***.com/questions/31030366/… 也编辑了我的答案。【参考方案2】:

哦,好吧...搜索 swift 的异步网络调用。你会发现很多东西。

但是是的...创建一个 NSMutableRequest,初始化 URL,将方法设置为 GET 或 POST。

现在制作:

let task = NSURLSession.sharedSession().dataTaskWithRequest(yourMutableRequest)  
data, response, error in 
// do your stuff here


task.resume()

这将异步运行,因此您需要考虑一种处理数据的方法。起初,您的响应数据在变量data 中,这是一种 NSData。你需要这个来创建你的字典:

let dictionaryOrArray = NSJSONSerialization.JSONObjectWithData(data, options:.MutableContainers, error: nil)

也许你需要把它放在一个守卫中,或者让statemant。

现在您需要将数据传递给函数调用者...您可以通过多种方式执行此操作,我更喜欢成功和失败块 您调用请求函数并提供成功和失败块。这个块将做最后应该发生的事情:

    let successBlock:[AnyObject]->Void =  response in 
     // handle your dict
    

    let failureBlock:NSError->Void =  error in 
    // error handling
    

    YourClass.fetchSomething(someURL, parameters: params, requestMethod: method, success : successBlock, failure: failureBlock)

类似的东西。在包含数据、响应、错误的请求块中,您只需执行以下操作:

If error 
    failure(error)
    return


success(dictionaryOrArray)

【讨论】:

以上是关于如何使用 Swift 2 + XCode 7 + iOS 9 获取和解析 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像添加到 PFTableViewCell Swift 2 Xcode 7

Swift 2 的 Xcode 7.0 更新问题

如何使用 Swift 2(Xcode 7)在我的 Sprite Kit 游戏中为背景音乐设置静音按钮?

无法使用 Swift 2 在 Xcode 7 beta 中导入 FBSDK

按下 xcode 7 / Swift 2 时如何更改按钮的图像? [复制]

Swift 2.0,Xcode 7 问题