iOS JSON Parse не работает (возвращает нулевой словарь)

Я использую NSJSONSerialization ' s JSONObjectWithData:data options: error: для анализа данных JSON, возвращенных с сервера.

теперь для параметра options я использую:NSJSONReadingAllowFragments. Вы можете посмотреть ниже и увидеть фактический JSON (где, я считаю, проблема).

сообщение об ошибке я получаю это:

ошибка домена=Nscocoaerrordomain код=3840 " операция не может быть завершена. (Ошибки какао 3840.)" (Недопустимое значение символов 0.) UserInfo=0x6895da0 {NSDebugDescription=недопустимое значение вокруг символа 0.}

есть идеи, как это исправить?

JSON =

{"name":"Johan Appleseed",
"email":"j.appleseed@emuze.co",
"phone":"+4121876003",
"accounts":{
    "facebook":[true,1125],
    "twitter":[false,null],
    "homepage":[true,"http://johnAplleseed.com/index.html"]}}

6 ответов


вероятно, у вас есть какой-то непечатаемый символ, который вы не видите. Попробуйте это:

NSData *jsonData = ...
const unsigned char *ptr = [data bytes];

for(int i=0; i<[data length]; ++i) {
  unsigned char c = *ptr++;
  NSLog(@"char=%c hex=%x", c, c);
}

чтобы убедиться, что у вас нет непечатаемых символов в начале или конце данных.

EDIT: чтобы уточнить, просто запустите вышеизложенное в словаре JSON - том, который не удается разобрать.


Ive acctualy обнаружил, что проблема заключается в том, что возврат из URL-адреса является HTML-страницей, и там все эти теги html, head и body вокруг фактического ответа, поэтому его нельзя разобрать. Это хороший вопрос и о том, как удалить HTML-теги из ответа (после того, как он был изменен в строку) : удалить HTML-теги из NSString на iPhone


у меня была такая же проблема некоторое время, я просто понял, что если я вытягиваю данные с веб-страницы, скажем, PHP-страницы, на этой странице не должно быть никаких HTML-тегов. Поэтому структуру:

<html>
<body>
<?php

?>
</body>
</html>

испортит ваш результат. превращая его в:

<?php

?> 

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


прошло некоторое время, но более простой способ печати данных:

NSLog (@ " %@", [[NSString alloc] initWithData: data кодировка:NSUTF8StringEncoding]);


один из способов есть, вы можете разобрать jsondata по запросу post

 -(void)callWebserviceList
 {
spinner.hidden=NO;

NSString *bodyData = @"code_request=monuments_list&asi_id=1";

NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL   URLWithString:@"http://asicircles.com/server_sync.php"]];

// Set the request's content type to application/x-www-form-urlencoded
[postRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

// Designate the request a POST request and specify its body data
[postRequest setHTTPMethod:@"POST"];
[postRequest setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] length:strlen([bodyData UTF8String])]];

connection1 = [NSURLConnection connectionWithRequest:делегат postRequest:self];

if(connection1 !=nil)
{
    ////NSLog(@"%@",postRequest);
}

}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

if ([connection isEqual:connection1 ])
{
     [responseData setLength:0];

}else if ([connection isEqual:connection2 ])
{
     [responseData1 setLength:0];
}

} - (void)соединение:(NSURLConnection *)соединение didReceiveData: (NSData *)данные {

    if ([connection isEqual:connection1 ])
  {
    [responseData appendData:data];

}else if ([connection isEqual:connection2 ])
{
     [responseData1 appendData:data];
}


//**check here for responseData & also data**

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if ([connection isEqual:connection1 ])
{
    spinner.hidden=YES;
    NSError *error;

    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

    NSMutableArray *arrdata=[json objectForKey:@"message"];
    NSLog(@"code is%@", json);

    for (int i=0; i< arrdata.count; i++)
    {
        [arrDetails addObject:[[arrdata objectAtIndex:i]objectForKey:@"details"]];
        [arrImageUrl addObject:[[arrdata objectAtIndex:i]objectForKey:@"image"]];
        [arrLat addObject:[[arrdata objectAtIndex:i]objectForKey:@"lat"]];
        [arrLongi addObject:[[arrdata objectAtIndex:i]objectForKey:@"longi"]];
        [arrName addObject:[[arrdata objectAtIndex:i]objectForKey:@"name"]];
        [arrLoc addObject:[[arrdata objectAtIndex:i]objectForKey:@"location"]];
        [arrID addObject:[[arrdata objectAtIndex:i]objectForKey:@"id"]];

        NSLog(@"code is%@",[[arrdata objectAtIndex:i]objectForKey:@"details"]);
        NSLog(@"code is%@",[arrImageUrl objectAtIndex:i]);

    }



    if (arrName.count > 0)
    {
        [self addscrollView];
    }



}else if ([connection isEqual:connection2 ])
{

}


}

вы также можете нажать url для данных json блоком в ios

 #define kBgQueue dispatch_get_global_queue(
 DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1
#define kLatestKivaLoansURL [NSURL URLWithString: 
 @"http://api.kivaws.org/v1/loans/search.json?status=fundraising"] //2

первое, что нам нужно сделать, это загрузить JSON-данные из интернета. К счастью, с GCD мы можем сделать это в одной строке кода! Добавьте следующее в ViewController.м:

- (void)viewDidLoad
{
[super viewDidLoad];

dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL: 
      kLatestKivaLoansURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) 
      withObject:data waitUntilDone:YES];
});
}
- (void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization 
    JSONObjectWithData:responseData //1

    options:kNilOptions 
    error:&error];

NSArray* latestLoans = [json objectForKey:@"loans"]; //2

NSLog(@"loans: %@", latestLoans); //3
}