2015-10-15 5 views
0

Я пытаюсь хранить JSON, которое в JSON я получаю от следующего запроса ...Разбор JSON В JSON в Objective-C

NSURL *URL = [NSURL URLWithString:@"http://www.demo.com/server/rest/login?username=admin&password=123"]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; 
[request setHTTPMethod:@"GET"]; 

NSURLSession *session = [NSURLSession sharedSession]; 
NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
            completionHandler: 
          ^(NSData *data, NSURLResponse *response, NSError *error) { 

           if (error) { 
            // Handle error... 
            return; 
           } 

           if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 
            NSLog(@"Response HTTP Status code: %ld\n", (long)[(NSHTTPURLResponse *)response statusCode]); 
            NSLog(@"Response HTTP Headers:\n%@\n", [(NSHTTPURLResponse *)response allHeaderFields]); 
           } 

           NSString* body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
           NSLog(@"Response Body:\n%@\n", body); 
          }]; 
[task resume]; 

В результате JSON получить от тела является следуя и, как вы видите, в JSON есть JSON, как я могу хранить , что JSON в NSDictionary, поскольку вы можете видеть, что JSON находится между кавычками.

[ 
     { 
      tag: "login", 
      status: true, 
      data: 
      " 
       { 
        "userID":1, 
        "name":"John", 
        "lastName":"Titor", 
        "username":"jtitor01", 
        "userEmail":"[email protected]", 
        "age":28, 
       } 
      " 
     } 
    ] 
+2

'NSArray * TopLevel = [NSJSONSerialization JSONObjectWithData: Параметры данных: 0 ошибок: ноль]; NSString * lowLevel = [[topLevel firstObject] objectForKey: @ "data"]; NSData * lowLevelData = [lowLevel dataUsingEncoding: NSUTF8StringEncoding]; NSDictionary * final = [NSJSONSerialization JSONObjectWithData: lowLevelData options: 0 error: nil]; 'или что-то подобное может сделать трюк. – Larme

+0

Да, это сработало, спасибо! – xzrudy

ответ

2

То, что вы на самом деле: Классический формат JSON, где внутри есть строка «представляющая» а JSON.

Таким образом, так как мы можем сделать:
NSData < => NSString
NSArray/NSDictionary < => JSON NSData
Мы просто должны переключаться между ними в зависимости от типа данных, которые мы имеем.

NSArray *topLevelJSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
NSString *lowLevelString = [[topLevelJSON firstObject] objectForKey:@"data"]; 
NSData *lowLevelData = [lowLevelString dataUsingEncoding:NSUTF8StringEncoding]; 
NSDictionary *final = [NSJSONSerialization JSONObjectWithData:lowLevelData options:0 error:nil]; 
0

Вы должны использовать эту строку кода

NSDictionary* responseDict = [NSJSONSerialization JSONObjectWithData: data options:kNilOptions error:&errorJson]; 

будет help.thanks

+0

@bayadi - вы проверяли, что URL-адрес действителен или нет, проверьте один раз, а затем отправьте свой ответ –

0

Попробуйте

- (void)loadDetails { 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
    [[session dataTaskWithRequest:request 
       completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
       _allVehicleLocationsArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
       [self afterCompleteDoThis]; 
      }] resume]; 
} 

- (void)afterCompleteDoThis { 
    for (NSDictionary *vehicleDict in _allVehicleLocationsArray) { 
     NSLog(@" PPP %@" , [vehicleDict valueForKey:@"vehicleType"]); 
    } 
}