2016-01-17 2 views
0

Я пытаюсь получить ответ от сервера как NSDictionary вместо NSData, поэтому сначала я использую библиотеку AFNetworking, и сервер запрашивает эти параметры как HTTP, а не JSON сериализатор, как следующий :Получите ответ как NSDictionary вместо NSData

self.responseSerializer = AFHTTPResponseSerializer() as AFHTTPResponseSerializer 
self.requestSerializer = AFHTTPRequestSerializer() as AFHTTPRequestSerializer 
self.requestSerializer.HTTPMethodsEncodingParametersInURI = NSSet(array: ["GET"]) as! Set<String> 

self.responseSerializer.acceptableContentTypes = NSSet(objects: "application/json","text/json","text/javascript","text/html") as? Set<String> 

Далее, когда я получаю ответ от сервера он приходит, чтобы быть NSData и его потому, что я использую AFHTTPRequestSerializer() и вот мой код:

self.POST(addUserURL, parameters: dictionary, progress: nil, success: { (task, responseObject) -> Void in 


    print(responseObject) 


    }) { (task, error) -> Void in 


} 

Кроме того, в боковым блоком AFNetworking не разрешено обрабатывать try и catch для NSJSONSerializtion, что может быть возможным решением, но оно не работает.

+1

Возможный дубликат [AFNetworking возвращения NSCFData; вопрос с registerHTTPOperationClass] (http://stackoverflow.com/questions/15558992/afnetworking-returning-nscfdata-issue-with-registerhttpoperationclass) – Cristik

ответ

0

Использование NSJSONSerialization для этого, как показано на рисунке код:

do { 
    let jsonObject = try NSJSONSerialization.JSONObjectWithData(responseObject, options: .AllowFragments) as! NSDictionary 
    // use jsonObject here 
} catch { 
    print("json error: \(error)") 
} 
+0

Я получаю: 'json error: Error Domain = NSCocoaErrorDomain Code = 3840" Текст JSON не начните с массива или объекта и опции, чтобы фрагменты не были установлены ». UserInfo = {NSDebugDescription = текст JSON не начинался с массива или объекта и не позволял фрагментам не задаваться.} ' –

+0

, потому что его AFHTTPResponseSerializer, поэтому я не могу установить параметры чтения, чтобы позволить фрагменты, я не мог найти решение для него во всем Интернете ! –

+0

Отвечено обновлено. –

0

В ответ, который вы получаете от сервера не имеет верхний объект уровня, либо Array или Dictionary вы должны указать пользовательские чтения параметров в который должен использоваться AFNetworking.

Для этого вам необходимо установить responseSerializer property на экземпляр AFURLSessionManager класс. Вы можете сделать это следующим образом:

let sessionManager = OLFURLSessionManager.init() //you probably want to keep session manager as a singleton 
sessionManager.responseSerializer = AFJSONResponseSerializer.serializerWithReadingOptions(.AllowFragments) 
//you should use that instance of session manager to create you data tasks 

После того, что вы должны быть в состоянии правильно разобрать ответ от сервера следующим образом:

Смежные вопросы