【问题标题】:Issue while printing JSON response in label在标签中打印 JSON 响应时出现问题
【发布时间】:2018-10-25 10:02:41
【问题描述】:

我是 swift 新手,我正在使用 alamofire 方法调用 API。我已成功获得响应,但无法理解如何在标签上解析这是我尝试过的代码

Alamofire.request(url, method: .get).responseJSON
{
    response in
    let result = response.result.value
    print(response)
    if result != nil{
        let data = result as! [String : AnyObject]


        let userdata = data["data"] as! NSDictionary

        let address = userdata["address"]
        let city = userdata["city"]
        let pincode = userdata["pincode"]
        let state = userdata["state"]
        self.lblAddress.text = city as? String
        self.lblCity.text = address as? String
        self.lblpincode.text = pincode as? String
        self.lblstate.text = state as? String
    }
}

这是我收到的回复

SUCCESS: {
    "city_address" = 
    (
        {
            address = "404 palladium business hub.";
            city = Ahmedabad;
            pincode = 380061;
            state = Gujarat;
        }
    );
}

无法理解我哪里出错了,请帮我解决这个问题。

print(result) 的输出

{
    "city_address" =     (
                {
            address = "404 palladium business hub.";
            city = Ahmedabad;
            pincode = 380061;
            state = Gujarat;
        }
    );
}

【问题讨论】:

  • 使用 Codable 将 json 响应映射到您的模型。
  • 你崩溃了,不行,给错误信息?我在您的代码中没有看到键“city_address”。该值是一个数组顺便说一句。守卫让地址=数据作为? [字符串:任何],让地址 = 地址。第一为? [String: Any]`,然后不使用userdata,而是使用address。但总的来说,避免使用强制解包、NSStuff(如 NSDictionary),并始终在主线程中更新 UI。最后,推荐使用 Swift 4 中的 Codable。

标签: swift api alamofire


【解决方案1】:

两个问题:

  1. 包含地址信息的对象是键city_address的值
  2. 这个对象显然是一个数组(注意括号)

并且不要在 Swift 中使用 NSDictionary 并且未指定的 JSON 值始终是 Any

if let result = response.result.value as? [String:Any], 
   let dataArray = result["city_address"] as? [[String : Any]], // maybe even `[[String:String]]`
   let userData = dataArray.first {
      let address = userData["address"]
      let city = userData["city"]
      let pincode = userData["pincode"]
      let state = userData["state"]
      DispatchQueue.main.async {
         self.lblAddress.text = address as? String
...

【讨论】:

  • if let dataArray = result?["city_address"] here for 时仍然给我错误?这个标志
  • 然后尝试删除? 你的代码result != nil 暗示result 是可选的。
  • 那么仍然给出错误和建议来补充!或者 ?但在两者都给崩溃
  • 我的代码不能崩溃。请print(result)(而不是response)并将输出添加到您的问题中
  • 根据result 输出我的代码是正确的(结果后没有?)并且不能崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 2021-01-22
相关资源
最近更新 更多