遍历来自 Alamofire 的 JSON 响应

Posted

技术标签:

【中文标题】遍历来自 Alamofire 的 JSON 响应【英文标题】:Loop through JSON response from Alamofire 【发布时间】:2015-12-22 09:21:09 【问题描述】:

我正在使用 xcode 7.2 和 swift 2.1.1。使用 Alamofire 进行服务器通信。我有一个显示动态数据的表格视图。数据包括 username 、 useremail 、 profilePicture 等。我尝试从*** 实现this 代码。但我收到一条警告消息说从“JSON”转换为不相关类型“[Dictionary]”总是失败我的 json 响应是


  "JsonRequestBehavior" : 1,
  "MaxJsonLength" : null,
  "ContentType" : null,
  "Data" : 
    "_id" : "5658444778a7531f4c79c23d",
    "Photo" : "",
    "AllowSharing" : "YES",
    "MemberCount" : 5,
    "Users" : [
      
        "_id" : "5658443478a7531f4c79c23c",
        "Photo" : "",
        "MembershipDate" : "0001-01-01T00:00:00",
        "MiddleName" : null,
        "FirstName" : "Gohan",
        "LastName" : null,
        "Email" : "gohan@gmail.com"
      ,
      
        "_id" : "566ea5f1dfead62350cf0fad",
        "Photo" : "",
        "MembershipDate" : "0001-01-01T00:00:00",
        "MiddleName" : null,
        "FirstName" : null,
        "LastName" : null,
        "Email" : "sachin@gmail.com"
      
    ],
    "MembershipDate" : "2015-12-14T12:03:12.819Z",
    "CreatedBy" : "5658443478a7531f4c79c23c"
  ,
  "ContentEncoding" : null,
  "RecursionLimit" : null

如何在 JSON 响应中遍历 Users

EDIT 根据 JohnyKutty 的回答,我在我的项目中尝试了相同的代码。相同的代码是

 Alamofire.request(.GET,App.AppHomeURL() + "Load_Group", parameters: ["groupid":"\(groupId)"]).responseJSON
            
                response in
                 print("\(response.data)")
                switch response.result
                

                case .Success(let _data):
                    let jsonData = JSON(_data)
                    print("Admin Response : \(jsonData)")

                do
                   
                    let json = try NSJSONSerialization.JSONObjectWithData(_data as! NSData, options: .AllowFragments) as! NSDictionary
                        if let DataObject = json["Data"] as? NSDictionary
                        
                            if let users = DataObject["Users"] as? [NSDictionary]
                            
                                for user in users
                                
                                    print("User id : \(user["_id"])")
                                
                            
                        

                   

                    catch let error as NSError
                    
                        print(error.localizedDescription)
                    

在这一行 让 json = 试试 NSJSONSerialization.JSONObjectWithData(_data as!NSData, options: .AllowFragments) as! NSDictionary 起初我使用“_data”,然后 Xcode 建议进行更改,它从 _data 更改为 _data as! NS 数据。

【问题讨论】:

你可以使用SwiftyJSON。 将 JSON 数据解析为自定义对象,然后对它们进行任何操作(例如迭代)都会很容易。 【参考方案1】:

你儿子的结构如下 JSON(字典)-> 数据(字典)-> 用户(字典数组)。所以首先你应该从原始 json 中选择 Users 数组,然后遍历它。

由于 alamofire 已经在序列化您的响应,无需再次使用 JSONSerializer,我正在更新我的答案。

更新 在机箱内试试这段代码

if let DataObject = _data["Data"] as? NSDictionary 
    if let Users = DataObject["Users"] as? [NSDictionary] 
        for user in Users 
            print(user["_id"],user["MembershipDate"],user["FirstName"],user["Email"], separator: "   ", terminator: "\n")
        
    

完整代码:

Alamofire.request(.GET,App.AppHomeURL() + "Load_Group", parameters: ["groupid":"\(groupId)"]) .responseJSON  response in
        switch response.result 

        case .Success(let _data):
            print(_data)
            if let DataObject = _data["Data"] as? NSDictionary 
                if let Users = DataObject["Users"] as? [NSDictionary] 
                    for user in Users 
                        print(user["_id"],user["MembershipDate"],user["FirstName"],user["Email"], separator: "   ", terminator: "\n")
                    
                
            

        default:
            break;
        



【讨论】:

我尝试了您的代码,但出现错误。让 json = 试试 NSJSONSerialization.JSONObjectWithData(_data as! NSData, options: .AllowFragments) as! NSDictionary 这是错误...Could not cast value of type '__NSCFDictionary' (0x109373ef0) to 'NSData' (0x109372e88). 你尝试过什么?你能用你的代码更新你的问题吗? 看来 _data 已经转换为 JSON 格式了,你可以使用 like 'if let DataObject = _data["Data"] as? NSDictionary'..... 是的,我已经按照您更新的方式更改了代码。它正在工作...... !!!

以上是关于遍历来自 Alamofire 的 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中解析来自 Alamofire API 的 JSON 响应?

我应该如何使用 Alamofire 和 SwiftyJSON 解析来自 API 的 JSON 响应?

如何显示来自 Alamofire 请求的 JSON 数组响应的某些部分

Swift 4 - 如何在 UIAlert 中显示来自 JSON Alamofire 的错误响应

解析 Alamofire json 响应

Alamofire 无法访问 json 响应的键