2013-02-14 2 views
1

다음 코드를 작성했지만 계속 사용하고 있습니다. 나는 이것의 많은 다른 변이를 시도했다 그러나 나는 특별하게 열심히 실패하고있다.JSON Objective-C 구문 분석 실패

이것은 서버에서 가져 오는 것입니다. 두 개체.

[{ "description": "yolo.", "yeah", "id": 1}, { "description": "sMITH", "name": "John" id ": 2}]

도움을 주시면 감사하겠습니다 ...... 감사합니다.

NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError]; 
    SBJsonParser *jsonParser = [[SBJsonParser alloc] init]; 
    NSArray *jsonObjects = [jsonParser objectWithData:response]; 
    NSMutableString *yolo = [[NSMutableString alloc] init]; 

      for (int i = 0; i < [jsonObjects count]; i++) { 
       NSDictionary *jsonDict = [jsonObjects objectAtIndex:i]; 
       NSString *IDID = [jsonDict objectForKey:@"id"]; 
       NSString *name = [jsonDict objectForKey:@"name"]; 

       NSLog(@"ID: %@", IDID); // THIS DISPLAYS 

       [yolo appendString: IDID]; // THIS seems to be causing the new error... 
       [yolo appendString:@": "]; 
       [yolo appendString: name]; 
       NSLog(@"%@", yolo);   // RETURNS NIL  
    } 

편집 : 때문에 캐치되지 않는 예외 'NSInvalidArgumentException'응용 프로그램 종료, 이유는

현재 나의 새로운 오류가 ...

: '- [NSDecimalNumber 길이] : 인식 할 수없는 선택 인스턴스로 전송 됨 0x81b89f0 '

+0

for 루프 앞에 response 및 jsonObjects를 기록 할 수 있습니까? –

+1

저는 iOS 프로그래밍에 익숙하지 않지만'alloc'와'init' yolo를 가지고 있지 않아요? –

+0

모두에게 감사드립니다 ... 나는 모든 체크 표시를 줄 수 있기를 바랬다. 내 바보 같은 실수를 고쳐 주셔서 감사합니다 -_- – freedom

답변

3

보인다. 이 오류 이전에 당신이 NSMutableString *yolo 초기화되지 않은 당신이 전무 객체에 appendString:를 사용하고 있기 때문에 지금 나타난

id myObject = [jsonDict objectForKey:@"id"]; 
NSString *IDID = nil; 

if ([myObject isKindOfClass:[NSNumber class]]) { 
    IDID = [[jsonDict objectForKey:@"id"] stringValue]; 
} else { 
    IDID = [jsonDict objectForKey:@"id"]; 
} 

라인 NSString *IDID = [jsonDict objectForKey:@"id"];로를 변경해야합니다. 지금은 NSMutableString *yolo = [[NSMutableString alloc] init];으로 초기화되었으므로 NSNumber을 전달할 때 입력으로 NSString 유형 만 허용하는 NSMutableString 객체에서 appendString을 호출하려고합니다. lengthappendString:가 내부적으로 호출하는 방법입니다. 따라서 이것을 변경해야합니다.

2

초기화하지 않음, 그래서 -appendString:을 호출 할 때마다 nil입니다. 이것을 시도하십시오 :

NSMutableString *yolo = [NSMutableString string]; 
+0

통찰력에 감사드립니다 ... 업데이트를 확인하십시오. 알 수없는 예외 'NSInvalidArgumentException', 이유로 인해이 error.Terminating 응용 프로그램을 받고 있어요. '- [NSDecimalNumber 길이] : 인식 할 수없는 선택기가 인스턴스 0x81b89f0에 전송되었습니다.' – freedom

2

NSMutableString을 초기화 해 보셨습니까? 당신의 [jsonDict objectForKey:@"id"]NSNumber (또는 NSDecimalNumber) 아닌 NSString처럼

NSMutableString *yolo = [[NSMutableString alloc] init]; 
+0

통찰력에 감사드립니다 ... 업데이트를 확인하십시오. 'NSInvalidArgumentException'이유 : '- [NSDecimalNumber length] : 인스턴스 0x81b89f0에 보낸 인식 할 수없는 선택기'로 인해이 오류가 발생했습니다. – freedom

1

JSON 피드를 통해 앱으로 전송되는 데이터의 유형을 실제로 확인하지 않은 것처럼 보입니다. 사용자가 실제로 앱을 사용할 때 임의의 충돌이 발생할 수 있습니다. 앱 스토어에 대한 거절의 이유이기도합니다. 앱이 리뷰되는 동안 크래시가 발생합니다.

당신은 안정적이고 사용 가능한 응용 프로그램을해야합니다 모범 사례를 구현함으로써 그들에 방법 :

를 호출하기 전에, 당신은 JSON로부터받은 모든 객체의 유형을 확인해야합니다. 데이터를 검증하기 위해 데이터 모델을 구축하십시오. http://www.jsonmodel.com/

0

데이터에서 "id"는 문자열이 아니고 숫자임이 분명합니다. NSString *에 포인터를 할당하면 마술처럼 NSString *으로 변환되지 않습니다. 그리고 그것이 NSString이 될 것이라고 생각할 때 NSDecimalNumber라는 객체가 있다는 것을 제외하고는 명백합니다.

그래서 IDID는 NSNumber *이며 NSString *으로 가장하면 충돌로 이어집니다.