Невозможно использовать результаты JSON из оболочки Forecastr

Я только начинаю работать с Objective-C и, похоже, не могу извлечь данные, извлекаемые AFNetworking для использования в качестве текста метки и т. Д. Я использую его для приложения погоды, поддерживаемого Forecast.io, и API Forecastr. обертка. Если API записывает JSON в словарь, я не могу его найти.

На главном экране контроллера:

[forecastr getForecastForLocation:location time:nil exclusions:nil success:^(id JSON) {
        NSLog(@"JSON response was: %@", JSON);
        NSLog(@"Testing: %@", [JSON valueForKey:kFCSummary]);

    } failure:^(NSError *error, id response) {
        NSLog(@"Error while retrieving forecast: %@", [forecastr messageForError:error withResponse:response]);
    }];
}

Первая строка NSLog вернет полный объект JSON, сериализованный и все, но вторая просто выдаст NULL.

В файле Forecastr.m:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
if (self.callback) {
    AFHTTPRequestOperation *httpOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [httpOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *JSONP = [[NSString alloc] initWithData:responseObject encoding:NSASCIIStringEncoding];
        if (self.cacheEnabled) [self cacheForecast:JSONP withURLString:cacheKey];
        success(JSONP);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        failure(error, operation);
    }];
    [pendingRequests addObject:httpOperation];
    [forecastrQueue addOperation:httpOperation];
} else {
    AFJSONRequestOperation *jsonOperation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
        success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        if (self.cacheEnabled) [self cacheForecast:JSON withURLString:cacheKey];
        success(JSON);
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){
        failure(error, JSON);
    }];
    [pendingRequests addObject:jsonOperation];
    [forecastrQueue addOperation:jsonOperation];
}

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

Я уже пробовал кучу разных вещей, таких как создание собственного словаря, но он не добавит туда объект JSON. Я также пытался использовать возвращенный объект JSON в качестве словаря и пары ключ-значение, но, похоже, ничего не работает. Я несколько дней бился головой о стену, но вряд ли кто-нибудь там использует Forecastr с такой проблемой.

2 ответа

Решение

Проблема в том, что возвращаемые вами данные разбиты на несколько различных разделов (например, текущий день и каждый из дней недели). Вы не можете просто запросить общий набор данных для температуры, вам нужно перейти к "интересующему вас" дню и затем запросить температуру. Такие как:

[[JSON objectForKey:kFCCurrentlyForecast] objectForKey:kFCTemperature]

JSON кажется строкой ( github). Чтобы разобрать это, вы можете использовать библиотеку, такую ​​как JSONKit.

Другие вопросы по тегам