无法使用 Alamofire 和 SwiftyJSON 访问数组内部的 url,JSON 响应

Posted

技术标签:

【中文标题】无法使用 Alamofire 和 SwiftyJSON 访问数组内部的 url,JSON 响应【英文标题】:can not access the url inside of array , JSON response , using Alamofire & SwiftyJSON 【发布时间】:2016-11-09 08:09:13 【问题描述】:

这是我从 URL 得到的 JSON 响应

 
 "message" : 
"8" : 
  "post_id" : 141,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1477452361.jpg"
    
  ]
,
"2" : 
  "post_id" : 129,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1477280037.jpg"
    
  ]
,
"9" : 
  "post_id" : 143,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1477453054.jpg"
    
  ]
,
"3" : 
  "post_id" : 131,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1477282075.jpg"
    
  ]
,
"user_posts" : "10",
"4" : 
  "post_id" : 133,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1477393524.jpg"
    
  ]
,
"user_img" : "http:\/\/www.thewoodjoynt.com\/Content\/Images\/Products\/NoImageAvailable.jpg",
"user_id" : null,
"5" : 
  "post_id" : 135,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1477393867.jpg"
    
  ]
,
"user_name" : null,
"6" : 
  "post_id" : 137,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1477393932.jpg"
    
  ]
,
"7" : 
  "post_id" : 139,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1477395902.jpg"
    
  ]
,
"following" : null,
"followers" : null,
"0" : 
  "post_id" : 110,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1475492476.jpg"
    
  ]
,
"1" : 
  "post_id" : 112,
  "post_img" : [
    
      "guid" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/IMG_1475494067.jpg"
    
     ]
,
"user_type" : false
 
  
  keys are &&&&&&&& ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
  fatal error: unexpectedly found nil while unwrapping an Optional value

我正在使用 Alamofire 4 和 SwiftyJSON 来处理 JSON 数据,这是我的 函数 用于获取数据并将其分配给变量:

func getJSON()

    let getEndPoint: String = "http://xxx/api/get_user_profile_info/"
    Alamofire.request(getEndPoint)
        .responseJSON  response in

            guard response.result.error == nil else 
                // got an error in getting the data, need to handle it
                print("error calling GET")
                print(response.result.error!)
                return
            

            if let value = response.result.value 

                let json = JSON(value)
                print(json)

                if let dic = json["message"].dictionary 

                    //for Profile Image
                    if let userUrl = dic["user_img"]?.stringValue 
                        self.user_image = URL(string: userUrl)
                    

                    //for collectionView Cell Image

                    //For getting only number keys with ascending order
                    let keys = (Array(dic.keys) as [String]).filter  (Int($0) != nil) .sorted 
                        (s1, s2) -> Bool in return s1.localizedStandardCompare(s2) == .orderedAscending
                    
                    print("keys are &&&&&&&&",keys)
                    //Loop through the keys Array and append all `post_image`.

                    for key in keys 
                        let post_imgAA = dic[key]?.array
                        for itemsIMG in post_imgAA! 
                            self.post_image = itemsIMG["guid"].URL
                        
                    

                    print("user_image are***********************************************")
                    print(self.user_image)

                    print("post_image are***********************************************")
                    print(self.post_image)

                     DispatchQueue.main.async 
                     self.afData = 1
                     self.collectionView.reloadData()
                     

               
           
      

我在这个 loop 中发现 nil 值

for key in keys 
                        let post_imgAA = dic[key]?.array
                        for itemsIMG in post_imgAA! 
                            self.post_image = itemsIMG["guid"].URL
                        
                    

处理 JSON 数据并将其转换为基础对象对我来说有点令人困惑,因为我在这方面还很陌生。如果有任何好心人可以提供帮助,那将是非常有帮助的。先感谢您。

【问题讨论】:

【参考方案1】:

你得到nil,因为key包含dictionary而不是Array,所以像这样改变。

for key in keys 
    if let innerDic = dic[key].dictionaryValue, 
       let post_imgAA = innerDic["post_img"].array 
        for itemsIMG in post_imgAA! 
            self.post_image = itemsIMG["guid"].URL
        
    

【讨论】:

我也更新了我对你之前问题的回答,在这里查看***.com/a/40459827/6433023我错过了理解回复。 你一直是我的救命稻草@Nirav D,真的不能感谢你,它会更少。 欢迎朋友 :) 并原谅我对回复的理解失误。 :) 这其实是一种祝福,因为我现在明白了,犯的错误越多,我从中学到的越多。再次感谢你,如果可能的话,请把你的推特链接发给我,我想关注你。 ta @ArafinMacRussell Sry mate 没有 twitter a/c

以上是关于无法使用 Alamofire 和 SwiftyJSON 访问数组内部的 url,JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Alamofire 测试存根响应

无法使用 AlamoFire 和 SwiftyJSON 解析 JSON

无法使用“((Any))”类型的参数列表调用“JSON” - 使用 AlamoFire 和 SwiftyJSON

无法使用 Alamofire 和 SwiftyJSON 在 tableviewcell 中加载 JSON 数据

无法使用 alamofire 打印 json 值

Alamofire 4 重试器和适配器无法看到更改的 accessToken