1

다음 오류가 발생합니다. 나는 그것이 JSON 배열의 결과에서 NSDictionary와 관련이 있다고 생각한다. 나는. 어쩌면 NSDictionary 내에서 NSDictionary?JSON ObjectiveC - 오류

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 [email protected]"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]]; 

    } 
} 

나는 괜찮은 것처럼 보이지만 어쩌면 그것이 내가 몇 시간 동안보고 있었기 때문일 수 있습니다.

아이디어가 있으십니까?

+0

Google "인식 할 수없는 선택기"와 그 의미를 확인하십시오. 그런 다음 실패한 라인을 식별 할 수 있도록 적절한 예외 스택 추적을 얻는 방법을 배웁니다. –

+0

하지만 JSON에 배열이 없다는 것이 핵심입니다. json.org로 가서 JSON 구문을 배우십시오. –

+0

안녕 핫 릭, 좋은 지적 "나는 인식 할 수없는 선택기"를 얻는 방법에 대한 검색을 생각하지 않았다. iOS에서 여전히 새로운 것이지만 매일 더 나은 감사를 보내고 있습니다! – Jeremy

답변

1

내가 당신의 URL로 이동이 메시지 {"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); 
} 
+0

안녕하세요, 죄송합니다. 보안을 위해 사용자 자격 증명을 빼 냈습니다. 나는 정보를 되 찾는다. 지금 제안을 검토하겠습니다. 감사! – Jeremy

+0

@ 제레미, 천만에요! –

+0

네가 한 일을 알았어. 당신이 한 일은 정확합니다. 난 그냥 반환 된 값 내에서 각 요소를 해결할 수 있습니다. for 루프 내의 온도, 풍속 등. – Jeremy

2
NSArray *currentMetarArray = metarJson[@"weatherObservation"]; 
for (NSDictionary *metaritem in currentMetarArray) 

이 라인이 잘못 일했다. currentMetarArray는 시러

있는 NSDictionary * jsonDictionary = 다음과 같은 액세스해야하도록 사전 아니라 어레이, 그것은 문자열 키 & 값이 포함되어있다 [: 데이터 옵션 : NSJSONSerialization JSONObjectWithData 0 오류 : & 오류]; NSDictionary * weatherObservation = [jsonDictionary objectForKey : @ "weatherObservation"];

다음 nCloud를 얻으려면 처럼 사용하십시오. NSString * nClouds = [weatherObservation objectForKey : @ "clouds"];

+0

안녕하세요, Russel, 그것을 찍어! 너와 minh 도움 사람 모두는 나가 신용을 줄 수 있던 경우에! 나는 두 사전을 갖는 것이 구문을 아는 열쇠가 아니라는 것을 알았습니다 (여전히 초보자 상태). 굉장한 소스 맨. – Jeremy

+0

@ 제레미, 도움이되는 사람을 알게되어 기쁘다. – russell

+0

전적으로 도움을 받았다. 너와 민. 다시 한번 감사드립니다! – Jeremy

0

발생하는 오류가이를 해결할 수있는 가장 좋은 단서입니다.

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x7f9298554560' 

이것은 실제로 개체가 사전이 아니라고 생각하는 것입니다. 개체가 당신이

또는

[myObject isKindOfClass:[NSDictionary class]]; // will return a boolean value. 

결정하기 위해 보낼 수 있도록 노력하겠습니다 방법에 응답 할 경우

[myObject respondsToSelector:(@selector(objectForKey:))]; // will return a boolean value. 

보고 : 같은

당신은 NSObject의 방법을 사용하여이 문제를 방지 할 수 있습니다 객체가 NSDictionary 인 경우.

그래도 일어날 수있는 일이지만, Deserialized JSON Data에 대한 예상치 못한 오류가 있습니다.

해피 버그 잡기!