读取 API 响应中的数据 | iOS
Reading Data in API response | iOS
我正在尝试在我的 iOS 项目中集成登录 API。当我在浏览器中点击 API 时,它会给出正确的 JSON 响应。然而,当我在我的应用程序中调用它时,我无法阅读 JSON。代码如下:
let url = NSURL(string: "myURL")
let request = NSURLRequest(URL: url!)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
if error != nil {
print (error)
}
do {
//jsonDict is always nil
if let jsonDict = try self.jsonFromData(data!) {
print (jsonDict)
}
}
catch {
print ("hi")
}
}
jsonFromData 为:
private func jsonFromData(jsonData: NSData) throws -> [NSDictionary]?
{
var jsonDict: [NSDictionary]? = nil
do
{
jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.AllowFragments) as? [NSDictionary]
}
catch
{
throw(error)
}
return jsonDict
}
API 在浏览器中点击时的响应如下:
请帮助我,我做错了什么。谢谢。
更新:
我刚刚检查过如果我将数据转换为字符串,它会给出正确的值。即
let string = NSString(data: jsonData, encoding: NSASCIIStringEncoding)
print (string)
//OUTPUT: Optional({"Authenticated":true,"CustomerID":000,"CustomerName":"TEMP","Members":[{"MemberID":000,"MemberNumber":"000","MembershipID":00,"MembershipExpiration":"\/Date(1517464799000-0600)\/","ValidBuyerTypes":[0]}]})
尝试改用 NSKeyedUnarchiver:
jsonDict = NSKeyedUnarchiver.unarchiveObjectWithData(jsonData)! as NSDictionary
我觉得这很合适。我唯一能想到的是(尽管字符串输出看起来像)您响应的顶级容器是 NOT 和 NSDictionary
。在您的 jsonFromData
函数中,我不会假设 JSONObjecWithData
的结果是 NSDictionary
,而是:
let iDunnoWhatThisIs = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.AllowFragments) // don't cast this to NSDictionary
看看你得到了什么。它应该是字典或数组,但是,由于您为选项设置了 NSJSONReadingOptions.AllowFragments
,因此它可能完全是其他东西。首先确保您实际上正在恢复您假设的状态,然后从那里开始。
看看你解码 JSON 和 as 的代码?陈述。您正在尝试获取 NSDictionary 数组。您打印的 JSON 包含一个字典,而不是一个数组。
我正在尝试在我的 iOS 项目中集成登录 API。当我在浏览器中点击 API 时,它会给出正确的 JSON 响应。然而,当我在我的应用程序中调用它时,我无法阅读 JSON。代码如下:
let url = NSURL(string: "myURL")
let request = NSURLRequest(URL: url!)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
if error != nil {
print (error)
}
do {
//jsonDict is always nil
if let jsonDict = try self.jsonFromData(data!) {
print (jsonDict)
}
}
catch {
print ("hi")
}
}
jsonFromData 为:
private func jsonFromData(jsonData: NSData) throws -> [NSDictionary]?
{
var jsonDict: [NSDictionary]? = nil
do
{
jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.AllowFragments) as? [NSDictionary]
}
catch
{
throw(error)
}
return jsonDict
}
API 在浏览器中点击时的响应如下:
请帮助我,我做错了什么。谢谢。
更新: 我刚刚检查过如果我将数据转换为字符串,它会给出正确的值。即
let string = NSString(data: jsonData, encoding: NSASCIIStringEncoding)
print (string)
//OUTPUT: Optional({"Authenticated":true,"CustomerID":000,"CustomerName":"TEMP","Members":[{"MemberID":000,"MemberNumber":"000","MembershipID":00,"MembershipExpiration":"\/Date(1517464799000-0600)\/","ValidBuyerTypes":[0]}]})
尝试改用 NSKeyedUnarchiver:
jsonDict = NSKeyedUnarchiver.unarchiveObjectWithData(jsonData)! as NSDictionary
我觉得这很合适。我唯一能想到的是(尽管字符串输出看起来像)您响应的顶级容器是 NOT 和 NSDictionary
。在您的 jsonFromData
函数中,我不会假设 JSONObjecWithData
的结果是 NSDictionary
,而是:
let iDunnoWhatThisIs = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.AllowFragments) // don't cast this to NSDictionary
看看你得到了什么。它应该是字典或数组,但是,由于您为选项设置了 NSJSONReadingOptions.AllowFragments
,因此它可能完全是其他东西。首先确保您实际上正在恢复您假设的状态,然后从那里开始。
看看你解码 JSON 和 as 的代码?陈述。您正在尝试获取 NSDictionary 数组。您打印的 JSON 包含一个字典,而不是一个数组。