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
}