JSON ObjectiveC - 错误
Posted
技术标签:
【中文标题】JSON ObjectiveC - 错误【英文标题】:JSON ObjectiveC - Error 【发布时间】:2014-11-24 03:47:09 【问题描述】:收到以下错误。我相信它与 JSON 数组结果中的 NSDictionary 有关。 IE。 NSDictionary 中的 NSDictionary 可能吗?
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x7f9298554560'
这是调用时的 JSON 服务。这是直接从 XCode 打印出来的,但对我来说看起来很干净。
Printing description of self->metArray:
weatherObservation =
ICAO = YBBN;
clouds = "few clouds";
cloudsCode = FEW;
countryCode = AU;
datetime = "2014-11-24 03:00:00";
dewPoint = 20;
elevation = 5;
hectoPascAltimeter = 1014;
humidity = 61;
lat = "-27.38333333333333";
lng = "153.1333333333333";
observation = "YBBN 240300Z 02019KT 9999 FEW029 SCT250 28/20 Q1014";
stationName = "Brisbane Airport M. O";
temperature = 28;
weatherCondition = "n/a";
windDirection = 20;
windSpeed = 19;
;
这是调用 JSON 服务的代码。
-(void)getMetar
// NSString *location = @"YBBN";
NSString * const metarUrl =@"http://api.geonames.org/weatherIcaoJSON?ICAO=YBBN&username=demo";
NSURL *url2 = [NSURL URLWithString:metarUrl];
NSData *data2 = [NSData dataWithContentsOfURL:url2];
metArray = [NSJSONSerialization JSONObjectWithData:data2 options:kNilOptions error:nil];
//Create an NSDictionary for the weather data to be stored.
NSDictionary *metarJson = [NSJSONSerialization JSONObjectWithData:data2 options:kNilOptions error:nil];
//Loop through the JSON array
NSArray *currentMetarArray = metarJson[@"weatherObservation"];
//set up array and json call
metarArray = [[NSMutableArray alloc]init];
for (NSDictionary *metaritem in currentMetarArray)
//create our object
NSString *nClouds = [metaritem objectForKey:@"clouds"];
NSString *nObservation = [metaritem objectForKey:@"observation"];
//Add the object to our animal array
[metarArray addObject:[[metar alloc]initWithclouds:(nClouds) andobservation:nObservation]];
对我来说看起来不错,但也许是因为我已经看了好几个小时了。
有什么想法吗?
【问题讨论】:
谷歌“无法识别的选择器”,看看它是什么意思。然后学习如何获取正确的异常堆栈跟踪,以便识别失败的行。 但有一点是您的 JSON 中没有数组。访问 json.org 并学习 JSON 语法。 嗨热舔,好点我没想过搜索如何获得“无法识别的选择器”。在 ios 上还是新手,但似乎每天都在变得更好,谢谢! 始终 Google 优先。通过这种方式,你学到的东西比你来这里并要求别人找到你的问题要多得多。 【参考方案1】: NSArray *currentMetarArray = metarJson[@"weatherObservation"];
for (NSDictionary *metaritem in currentMetarArray)
这些行是错误的。 currentMetarArray 是字典,而不是数组,它包含字符串键和值,因此您应该按照以下方式访问它-
NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; NSDictionary *weatherObservation = [jsonDictionary objectForKey:@"weatherObservation"];
然后要获取 nCloud,请使用 like NSString *nClouds = [weatherObservation objectForKey:@"clouds"];
【讨论】:
嗨罗素,成功了!伙计,你和 minh 都帮助了如果我能给予学分,我会的!我认为拥有两个字典是关键,只是不知道语法如何去做(仍然是新手状态)。很棒的酱汁人。 完全有帮助。你和敏。再次感谢大家!【参考方案2】:我转到您的网址并收到此消息"status":"message":"the daily limit of 30000 credits for demo has been exceeded. Please use an application specific account. Do not use the demo account for your application.","value":18
但是你可以试试我的代码,它对我有用
NSString *strUrl = @"http://api.geonames.org/weatherIcaoJSON?ICAO=YBBN&username=demo";
NSURL *url = [NSURL URLWithString:strUrl];
NSData *data = [NSData dataWithContentsOfURL:url];
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSDictionary *weatherObservation = [json objectForKey:@"status"];
for (id key in weatherObservation)
id value = [weatherObservation objectForKey:key];
NSLog(@"key = %@, value = %@", key, value);
【讨论】:
您好,Minh,很抱歉忘记提及,为了安全起见,我取出了我的用户凭据。我确实得到了信息。我现在将审查您的建议。谢谢! 好的,我知道你做了什么。你所做的是正确的。我只是计算返回值中的每个元素。即 for 循环中的温度、风速等。【参考方案3】:抛出的错误是解决此问题的最佳线索。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x7f9298554560'
这意味着你认为一个对象是一本字典,而实际上它不是。
您可以使用 NSObject 方法解决这个问题,例如:
[myObject respondsToSelector:(@selector(objectForKey:))]; // will return a boolean value.
查看对象是否会响应您希望发送的方法
或
[myObject isKindOfClass:[NSDictionary class]]; // will return a boolean value.
判断对象是否为 NSDictionary。
不过,可能发生的情况是您对反序列化 JSON 数据的预期错误。
寻找错误快乐!
【讨论】:
以上是关于JSON ObjectiveC - 错误的主要内容,如果未能解决你的问题,请参考以下文章
目标 C:从字典错误中创建一个 json 对象。字典值只能是字符串
如何在Objective C中使用NSData创建json对象?