2017-03-03 49 views
0

我正在尝试在我的iOS项目中集成登录API。当我在浏览器中打开API时,它给了我正确的JSON响应。而当我在我的应用程序中调用它时,我无法阅读JSON。代码如下:在API响应中读取数据| iOS

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是:API的

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 
} 

响应,在浏览器中点击时是:

enter image description here

请帮助我,我我做错了。谢谢。

更新: 我只是检查,如果我将数据转换为字符串,它会给出正确的值。即

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

回答

1

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

0

尝试使用NSKeyedUnarchiver代替:

jsonDict = NSKeyedUnarchiver.unarchiveObjectWithData(jsonData)! as NSDictionary 
1

这看起来我的权利。我唯一能想到的是(尽管字符串输出看起来像),响应的顶级容器是而不是NSDictionary。在你jsonFromData功能,而不是假设的JSONObjecWithData的结果将是一个NSDictionary,我会说:

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

,看看你会得到什么。它应该是一个字典或一个数组,但是,由于您为选项设置了NSJSONReadingOptions.AllowFragments,所以它可能完全是其他内容。首先让你确信你实际上已经恢复了你的假设,并从那里开始。

+0

是的,我解决这个问题。答案是字符串(最可能)。然后我将字串输入字典中。我也会分享我的答案。 –