在API响应中读取数据| iOS版

时间:2017-03-03 18:50:55

标签: ios json api nsdata

我正在尝试在我的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的响应如下:

enter image description here

请帮助我,我做错了什么。感谢。

更新 我刚刚检查过,如果我将数据转换为String,它会给出正确的值。即

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]}]})

3 个答案:

答案 0 :(得分:1)

这对我来说是正确的。我唯一能想到的是(尽管字符串输出看起来像),你的响应的顶级容器是 NOT NSDictionary。在jsonFromData函数中,我会说:{/ 1}}而不是假定JSONObjecWithData的结果为NSDictionary

let iDunnoWhatThisIs = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.AllowFragments) // don't cast this to NSDictionary

看看你得到了什么。它应该是字典或数组,但是,因为您为选项设置了NSJSONReadingOptions.AllowFragments,所以它可能完全是其他东西。首先要确保你实际上回到了你所假设的并从那里开始。

答案 1 :(得分:1)

查看解码JSON和as的代码?声明。您正在尝试获取一组NSDictionary。您打印的JSON包含单个字典,而不是数组。

答案 2 :(得分:0)

尝试使用NSKeyedUnarchiver:

jsonDict = NSKeyedUnarchiver.unarchiveObjectWithData(jsonData)! as NSDictionary