Сбой приложения при использовании JSON-Framework - PullRequest
0 голосов
/ 09 декабря 2011

Вот код, который я использую для создания данных опроса из среды json.Однако каждый раз, когда я запускаю приложение, оно падает.Любой совет?

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    self.responseData = nil;

    NSArray *latestEvent = [(NSDictionary*)[responseString JSONValue] objectForKey:@"Events"];
    [responseString release];

    //Choose event
    NSDictionary *flashMob = [latestEvent objectAtIndex:0];

    //Fetch the Data
    NSString *name = [flashMob objectForKey:@"event"];
    NSDate *eDate = [flashMob objectForKey:@"date"];
    NSString *location = [flashMob objectForKey:@"location"];
    NSString *danceVid = [flashMob objectForKey:@"dancevideo"];

    //Set the text to the label
    label.text = [NSString stringWithFormat:@"Next Flash Mob is: %@, on %@, near %@, with Dance: %@", name, eDate, location, danceVid];

}

И Json:

{ "Events":[{"id":0001,"event":"Party Rock Anthem Flash Mob","date":"12/18/2011",
"dancevideo":"http://www.youtube.com/watch?v=dP2ddTuMKIg","Location":"Flatirons Crossing,       Broomfield, CO"}]
}

Редактировать Я также включаю метод viewDidLoad, если вызов может быть неудачным.

 - (void)viewDidLoad
    {
        [super viewDidLoad];

        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.corliosity.com/denverflash.json"]];
        [[NSURLConnection alloc] initWithRequest:request delegate:self];
        responseData = [[NSMutableData data] retain];

        // Do any additional setup after loading the view from its nib.
    }

Ответы [ 4 ]

0 голосов
/ 11 декабря 2011

Помимо сломанного JSON (если вы измените значение "id" с 0001 на 1 или "0001", оно работает) Я думаю, что ваша фундаментальная проблема заключается в следующих двух строках:

NSDate *eDate = [flashMob objectForKey:@"date"];
NSString *location = [flashMob objectForKey:@"location"];

Вы присваиваете NSString указателю типа NSDate.(Нет автоматического преобразования NSString в NSDate, даже если оно выглядит как дата.) Скорее всего, это ваша основная проблема.

Во-вторых, ваша переменная location будет nil, потому что ваши данные имеютключ Location, но ваш код использует location со строчной буквой "L".

0 голосов
/ 09 декабря 2011

Попробуйте этот код ниже

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // try this code here
    NSDictionary *JSONDictionary = [[[[SBJsonParser alloc] init] autorelease] objectWithData:responseData];
    [self.responseData release] // only if is retained by your class.
    self.resposeDate = nil;

    NSArray *latestEvent = [JSONDictionary valueForKey:@"Events"];
    [responseString release];

    //Choose event
    NSDictionary *flashMob = [latestEvent objectAtIndex:0];

    //Fetch the Data
    NSString *name = [flashMob objectForKey:@"event"];
    NSDate *eDate = [flashMob objectForKey:@"date"];
    NSString *location = [flashMob objectForKey:@"location"];
    NSString *danceVid = [flashMob objectForKey:@"dancevideo"];

    //Set the text to the label
    label.text = [NSString stringWithFormat:@"Next Flash Mob is: %@, on %@, near %@, with Dance: %@", name, eDate, location, danceVid];
}

Теперь вы должны увидеть ключ Events внутри JSONDictionary, соответствующий объект должен быть массивом словаря.Обработайте его так, как вы предпочитаете.

0 голосов
/ 09 декабря 2011

Я пропустил вашу строку JSON через валидатор, http://jsonlint.com, и она не работает.Он ожидает строку для вашего идентификатора и получает номер.Я бы проверил, откуда вы получаете ваши данные, может быть, это так просто.

0 голосов
/ 09 декабря 2011

Проверьте функцию обратного вызова didReceiveResponse и проанализируйте заголовки и код ошибки.

Я не вижу проблем в JSON. Но проверьте формат JSON с помощью метода eval javascript.

Когда я пытался проверить эту строку JSON с помощью онлайнового валидатора json , я мог увидеть одну ошибку.

...