2015-10-28 3 views
1

Привет, я сталкиваюсь с проблемой при преобразовании NSData в NSDictionary с использованием NSJSONSerialization?Как преобразовать NSData в NSDictionary с помощью NSJSONSerialization?

Я получил данные, используя свой код, но не смог его преобразовать в json.

Вот мой код ...

ViewController.h Файл

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController<NSURLConnectionDelegate> 
{ 
    NSString *massage; 
    NSURL *url; 
    NSMutableURLRequest *request; 
    NSURLConnection *connection; 
    NSMutableData *httpbody; 
    NSMutableData *webData; 
    NSData *responceData; 
    NSDictionary *responceJson; 
} 

и ViewController.m Файл

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    NSString *mobile = @"123456789"; 

    NSString *password = @"Welcome123"; 

    NSString *deviceId = @"123sdfg15641ert321ret"; 


    url = [NSURL URLWithString:@"http://203.109.87.34:8585/d-cab/web/app_dev.php/api/v1"]; 

    massage = [NSString stringWithFormat:@"{\"action\":\"login\",\"data\":{\"contact\":\"%@\",\"password\":\"%@\",\"deviceId\":\"%@\"}}",mobile,password,deviceId]; 
    //NSLog(@"Body = %@", massage); 
    httpbody = [ NSMutableData dataWithBytes: [ massage UTF8String ] length: [ massage length ] ]; 
    request = [NSMutableURLRequest requestWithURL: url]; 
    [request setHTTPMethod: @"POST"]; 
    [request setHTTPBody: httpbody]; 
    [request setTimeoutInterval:10.0]; 
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    //NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
    //[connection start]; 
    if (connection) { 
     webData = [[NSMutableData alloc]init]; 
    } 

} 

#pragma mark NSURLConnection Delegate Methods 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [webData setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [webData appendData:data]; 
    //NSLog(@"WebData = %@",webData); 
    //NSLog(@"================================="); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    NSError* error = nil; 
    responceJson = [NSJSONSerialization JSONObjectWithData:webData options:kNilOptions error:&error]; 
    NSLog(@"ResponceJSON = %@",responceJson); 

} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    // Show error message 
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error In connection" message:@"We are facing some problem in connection. Please Check your Internet Connection." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
    [alert show]; 
} 


- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

Пожалуйста Проверьте свой код и скажите мне, где и какое изменение я должен сделать?

ответ

2

Эй Спасибо всем, кто обратил внимание на мой вопрос ....
Но я нашел эту проблему в моем вопросе.
Я пытаюсь отправить параметр в строковый формат вместо словарного формата и не указывать заголовок для запроса.
Вот мой обновленный код ...

NSDictionary *paramData = [[NSDictionary alloc]initWithObjectsAndKeys:mobile,@"contact",password,@"password",deviceId,@"deviceId", nil]; 
    //NSLog(@"paramData = %@",paramData); 
    jsonParam = [[NSDictionary alloc]initWithObjectsAndKeys:@"login",@"action",paramData,@"data", nil]; 
    //NSLog(@"jsonParam = %@",jsonParam); 

    httpbody = [NSJSONSerialization dataWithJSONObject:jsonParam options:0 error:nil]; 

    request = [NSMutableURLRequest requestWithURL: url]; 
    request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:[NSString stringWithFormat:@"%d", [httpbody length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody: httpbody]; 
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if (connection) { 
     webData = [[NSMutableData alloc]init]; 
    } 

Он работал для меня ....

+0

Наконец-то вы получили решение, хорошее –

1

Попробуйте использовать следующий код:

responceJson = [NSJSONSerialization JSONObjectWithData:webData 
            options:NSJSONReadingMutableContainers 
            error:&error]; 
+0

этот метод не работает он дает мне «нулевой» значение «responceJson» – Diwakar

+0

вы пробовали данные печати в didReceiveData и после добавления правильно ли обновляется webData? –

0

Ну проблема здесь не в задаче преобразования в этом Funtion

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
//[webData setLength:0]; 
webdData = [[NSMutableData alloc] init]; 
    } 

Это будет help.Thanks

+0

Этот метод также не работал, он дал мне «нулевое» значение в «responceJson» – Diwakar

+0

, чем проблема в вашем запросе, проверьте, правильно ли он – baydi

+0

МОЖЕТЕ ЛИ ВЫ ПОПРОСИТЬ МНЕ ЭРОРА ЗАПРОСИТЬ ИЛИ ПОЛУЧИТЬ МНЕ ПРИМЕР – Diwakar

0
NSURLConnection *theConnection = [NSURLConnection connectionWithRequest:request delegate:self]; 
    if(theConnection) 
    { 
     mdata = [[NSMutableData alloc]init]; 
    } 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    mdata.length=0; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [mdata appendData:data]; 
} 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // Data store in dictionary when connection proceed in background 

    dict=[NSJSONSerialization JSONObjectWithData:mdata options:kNilOptions error:nil]; 
    NSLog(@"%@",dict); 
} 

Это работает gooood ...

+0

Я использую тот же метод NSJSONSerialization, но он возвращает null для меня .. – Diwakar

+0

у вас пробовал ваш URL и параметр в почтальоне? –

+0

Я пробовал это в почтальоне, и он работает правильно ... – Diwakar

0

Постарайтесь проверить, какая у вас загрузка. Преобразование NSData в NSString. В didFinishLoading печатает это:

NSString *tempString = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding]; 
NSLog(@"loaded data: %@",tempString);