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 - 错误的主要内容,如果未能解决你的问题,请参考以下文章

未分配对象指针的 iOS Objec-C 错误

目标 C:从字典错误中创建一个 json 对象。字典值只能是字符串

如何在Objective C中使用NSData创建json对象?

在示例 gdata-objectivec-client 中出现“invalid_client”错误

在Objective C中创建JSON数组[重复]

在 Objective C (iOS) 中解析 JSON