解析通过Alamofire(Swift)接收的JSON数据时出错

时间:2018-05-09 06:58:06

标签: ios json swift alamofire

我正在与一家非盈利组织合作,帮助他们为自己的网站开发移动应用程序(因此他们为我提供了后端服务等)

他们的登录PHP服务接受JSON中的数据,并以JSON数据的形式返回true或false值,但我在Swift中处理响应时遇到问题。我正在使用Alamofire连接到HTTP服务。

我附上了我的代码以及我在下面收到的异常消息,真的很感激一些帮助

func authenticateUser (un: String, pw: String)  -> Bool
{
    var checker = false
    let jsonDict : [String: String] = ["volunteer_email": un, "volunteer_pass": pw]

     Alamofire.request("www.sampleurl.com/login.php", method: .post, parameters: jsonDict, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if response.result.value != nil{
                print (response.result.value)
                let resp = response.result.value as! NSDictionary
                let results = resp["status"] as! [[String:Any]]
                //Change the boolean value of checker based on the value of the results constant
                print (results)
            }
            break

        case .failure(_):
            print(response.result.error)
            break
        }
    }

    return checker;
}

日志:

  

可选(&lt; __ NSSingleObjectArrayI 0x600000009b50&gt;({       status = false; }))无法转换类型&#39; __ NSSingleObjectArrayI&#39;的值(0x10e28c528)到&#39; NSDictionary&#39;   (0x10e28d1a8)。 2018-05-09 12:13:00.177091 + 0530 TestApp1 [16680:817883]   无法转换类型&#39; __ NSSingleObjectArrayI&#39;的值(0x10e28c528)来   &#39;的NSDictionary&#39; (0x10e28d1a8)。 (LLDB)

记录response.result.value:

注意:&#34;状态&#34;:&#34; false&#34; /&#34; true&#34;是Web服务的输出

  

可选(&lt; __ NSSingleObjectArrayI 0x60400001b160&gt;(   {       status = false;   }   ))

注意:我做了一些研究,我理解了NSSingleObjectArray是什么以及它是什么导致它,但是我被困在这里,因为服务只将一个JSON值传回给我的应用程序。有没有办法处理这个没有要求组织更改他们的代码?从逻辑上讲,我不应该将响应转换为NSDictionary,无论其大小如何?

另外,我之所以指定返回的数据可以是any类型,是因为我遇到了一个问题,可以在这里找到:

Other StackOverflow question

提前非常感谢:)

2 个答案:

答案 0 :(得分:2)

由于您正在使用Alamofire的.responseJSON,因此您应该使用Alamofire的参数化枚举。它在.success中提供了json对象。所以做case .success(_)是浪费的。

继续这样做,根本不需要进行类型转换response.result.value

Alamofire
    .request("www.sampleurl.com/login.php",
             method: .post,
             parameters: jsonDict,
             encoding: JSONEncoding.default,
             headers: nil)
    .responseJSON { (response) in            
        switch(response.result) {
        case .success(let responseJSON):
            print(responseJSON)

            /*
             As an improvement:
             To obtain an easy-access object, convert responseJSON to either a:
              1. Codable model:
                 let model = JSONDecoder().decode(SomeModel.self, 
                                                  from: responseJSONData)
              2. SwiftyJSON object: (available on GitHub)
                 let json = JSON(responseJSON)

             Doing so will basically make accessing the inner elements easier.
             */...

        case .failure(let error):
            print(error)
        }
}

BTW,仅供参考:响应是一个字典数组,而不是字典数组的字典。

答案 1 :(得分:0)

使用NSArray代替NSDictionary

func authenticateUser (un: String, pw: String)  -> Bool{
var checker = false
let jsonDict : [String: String] = ["volunteer_email": un, "volunteer_pass": pw]

 Alamofire.request("www.sampleurl.com/login.php", method: .post, parameters: jsonDict, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

    switch(response.result) {
    case .success(_):
        if response.result.value != nil{
            print (response.result.value)
            let resp = response.result.value as! NSArray
            let results = resp["status"] as! [[String:Any]]
            //Change the boolean value of checker based on the value of the results constant
            print (results)
        }
        break

    case .failure(_):
        print(response.result.error)
        break
      }
   }

return checker;
 }