Ios 无法使用来自Forecast包装的JSON结果

Ios 无法使用来自Forecast包装的JSON结果,ios,objective-c,afnetworking,weather-api,forecastr,Ios,Objective C,Afnetworking,Weather Api,Forecastr,我刚开始使用Objective-C,似乎无法提取AFNetworking提取的数据用作标签文本等。我将其用于Forecast.io支持的天气应用程序和API包装器。如果API正在将JSON写入字典,我似乎找不到它 在主视图控制器中: [forecastr getForecastForLocation:location time:nil exclusions:nil success:^(id JSON) { NSLog(@"JSON response was: %@", JSON)

我刚开始使用Objective-C,似乎无法提取AFNetworking提取的数据用作标签文本等。我将其用于Forecast.io支持的天气应用程序和API包装器。如果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

在forecast.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对象用作字典和键值对,但似乎没有任何效果。好几天来,我的头一直撞在墙上,但几乎没有人在使用Forecast时遇到问题。

JSON似乎是一个字符串()。为了解析它,您可以使用一个库,例如。

JSON似乎是一个字符串()。为了分析这个问题,您可以使用一个库,例如。

问题是,您要返回的数据被分成许多不同的部分(例如当前日期和一周中的每一天)。你不能只询问温度的总体数据集,你需要导航到你感兴趣的“一天”,然后请求温度。例如:

[[JSON objectForKey:kFCCurrentlyForecast] objectForKey:kFCTemperature]

问题是,您要返回的数据被分成许多不同的部分(例如当前日期和一周中的每一天)。你不能只询问温度的总体数据集,你需要导航到你感兴趣的“一天”,然后请求温度。例如:

[[JSON objectForKey:kFCCurrentlyForecast] objectForKey:kFCTemperature]

或者只使用内置的
NSJSONSerialization
类。JSONP不是缓存的JSON对象吗?在视图控制器中,它从JSON id读取它。我将尝试JSONKit,它已经被序列化,因为控制台日志是可读的和格式化的。他不是以JSONP的形式请求它,而是以JSON的形式请求它,因此它已经作为序列化对象返回。如果是JSONP请求,则在Forecast中设置一个
回调
属性。(我写了forecast)或者只使用内置的
NSJSONSerialization
类。JSONP不是缓存的JSON对象吗?在视图控制器中,它从JSON id读取它。我将尝试JSONKit,它已经被序列化,因为控制台日志是可读的和格式化的。他不是以JSONP的形式请求它,而是以JSON的形式请求它,因此它已经作为序列化对象返回。如果是JSONP请求,则在Forecast中设置一个
回调
属性。(我写了forecast)将日志更改为NSLog(@“JSON响应为:%@”,NSStringFromClass([JSON类]);告诉我们它说了什么。如果您得到一个字符串,则可能是对库的调用配置不正确。如果你得到一个字典,你的键可能是错的,它返回:“JSON响应是:_NSCFDictionary”。这是否意味着JSON存储在某种类型的NSDictionary中?我到处搜索NSCFDICTIONAL,可以看到它是一个私有子类,但我找不到如何使用它。使用@“Test:%@,[JSON objectForKey:kFCTemperature]仍然返回空值。是的。可能只是温度不可用(就像文档中所说的那样)。您尚未提供JSON响应,因此我不能再说更多。我已将get记录的内容放在一个中。即使使用文档中描述的确切方法,它仍然返回空值。将日志更改为NSLog(@“JSON响应为:%@”,NSStringFromClass([JSON class]));并告诉我们它是怎么说的。如果你得到一个字符串,你可能配置了对库的调用不正确。如果你得到一个字典,你的密钥可能是错误的。返回:“JSON响应是:u NSCFDictionary”。这是否意味着JSON存储在某种类型的NSDictionary中?我四处搜索了NSCFDictionary,发现它是一个私有子类,但找不到如何使用它。使用@“Test:%@,[JSON objectForKey:KfctTemperature]仍然返回空值。是的。可能只是温度不可用(就像文档中说的那样)。您还没有提供JSON响应,所以我不能多说。我已经将get记录的内容放入了。即使使用文档中描述的确切方法,它仍然返回空值。这听起来像是正确的,但我仍然有点无法理解。我尝试使用
[kFCCurrentlyForecast valueForKey:KfctTemperature];
设置一些标签文本,但它引发了一个异常。
2013-06-16 14:55:37.773 WeatherBud[71223:c07]***由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[ValueForUnfinedKey:]:此类不符合键温度的键值编码。
kFCCurrentlyForecast
kFCTemperature
都是字符串常量,只能用作访问字典中数据的键。
JSON
是包含其他字典(和数组)的字典吗。你在评论中粘贴的那行与我答案中的那行不一样。你为什么试图将一个键用作字典?我不确定如何导航到正确的字典。但我只是用你的方法重试了一下,结果成功了!非常感谢,我会接受你的答案。这听起来好像很正确,但我还是有点担心我试图使用
[kfccurrently预测值forkey:kFCTemperature];
设置一些标签文本,但它抛出了一个异常。
2013-06-16 14:55:37.773 WeatherBud[71223:c07]***由于未捕获的异常而终止应用程序