2014-06-17 22 views
7

Tôi đã đọc this question và cố gắng phân tích cú pháp JSON khỏi phản hồi của AFNetworking trong Swift nhưng kết quả luôn là nil.Không thể phân tích cú pháp JSON từ phản hồi của AFNetworkingObject

Dưới đây là đoạn trích từ mã của tôi:

let manager = AFHTTPRequestOperationManager() 

manager.requestSerializer = AFJSONRequestSerializer() 
manager.responseSerializer = AFJSONResponseSerializer() 
manager.requestSerializer.setAuthorizationHeaderFieldWithUsername(username, password: password) 

manager.POST("endpoint-that-respond-token-in-json", 
    parameters: nil, 
    success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in 
     println(responseObject.description) // { token = "bd8f26da-219a-4a88-be80-b09207dfc067"; } 

     var x: NSString = responseObject.description 

     var error: NSError? 
     var data = x.JSONString().dataUsingEncoding(NSUTF8StringEncoding) 
     println(data) // <227b5c6e 20202020 746f6b65 6e203d20 5c226539 35613462 36642d38 6361612d 34343537 2d623937 612d3330 63613236 62316338 34315c22 3b5c6e7d 22> 

     var dataString = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println(dataString) // "{\n token = \"e95a4b6d-8caa-4457-b97a-30ca26b1c841\";\n}" 


     var json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary! 
     println(json) // nil 
    }, 
     failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in 
     println(error) 
    }) 

N.B.

var json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary // without "!" I will get EXC_BAD_INSTRUCTION at run time. 

Trả lời

10

Bạn có thể cast responseObject vào từ điển

ví dụ

manager.POST("endpoint-that-respond-token-in-json", 
parameters: nil, 
success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in 
    println(responseObject.description) // { token = "bd8f26da-219a-4a88-be80-b09207dfc067"; } 

    let responseDict = response as Dictionary<String, AnyObject> 
    var token = responseDict["token"] as String! 
    println(token) 

}, 
    failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in 
}) 

tái bút: sự trở lại giá trị từ điển luôn là tùy chọn

EDIT: Sau Xcode6 beta2 phát hành, mã trên doest không hoạt động nữa. Trước tiên, bạn cần truyền nó tới AnyObject rồi truyền tới chuỗi

let token : String? = (responseDict["token"] as AnyObject?) as? String 
+0

Oh man, bạn đã cứu mạng tôi. Cảm ơn nhiều. – attomos

Các vấn đề liên quan