如何使用 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)在我的 Sprite Kit 游戏中为背景音乐设置静音按钮?
无法使用 Swift 2 在 Xcode 7 beta 中导入 FBSDK