2013-01-24 3 views
2

JSON 유형의 데이터에 대한 비동기 요청을 만드는 앱을 개발 해왔다. 최근에 코드에서 이상한 버그를 발견했는데 왜 그런 일인지 알 수 없습니다.비동기 요청에서 NSJSONSerialization이 null을 반환하는 경우가 있음

코드를 확인해보세요.

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

NSError *error=nil; 

    result = [NSJSONSerialization JSONObjectWithData:retrievedData options:kNilOptions error:&error]; 
     NSLog(@"Result %@",result); 
     NSLog(@"Retrieved data %@",retrievedData); 
} 

결과는 NSDictionary이고 retrieveData는 NSMutableData입니다. 99 %의 시간, 잘 작동하고 connectionDidFinishLoading이 호출되고 결과가 채워집니다. 그러나, 시간의 1 %에서 검색된 데이터는 데이터로 채워,하지만 내 결과는 널 (null)입니다 (당신이 사진을 볼 수있는 사람이

Log

편집을 제발 도와 수 없습니다 :..? 내가 얻을 오류

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Garbage at end.) UserInfo=0x753e5c0 {NSDebugDescription=Garbage at end.} 

답변

3

당신이 잘못 무엇의 표시를 제공하는지 먼저 오류를 살펴 경우가 도움이 될 것이다.

[편집]
다음오류는 이유를 언급합니다 : Garbage at end..

웹 서버의 응답이 유효한 JSON이 아니며 출력 끝에 유효하지 않은 문자가 포함되어 있습니다.

+0

맞습니다. 오류를 확인하는 것을 잊었습니다.고마워, 내 질문을 업데이 트 :) – Yanchi

+0

그래서 내 문제는 아니지만 실제로 서버 측에 있습니까? 그것은 대부분의 시간이 잘 작동하기 때문에 이것을 묻는 Im, 그리고 우리는 안드로이드 애플 리케이션이 결코 발생하지 않습니다 :( – Yanchi

+0

오류로 판단, 예. 당신은 실제 내용을 볼 문자열로'retrievedData' 변환하여 확인할 수 있습니다 이걸 JSON 검사기에 던지십시오. –

2

나는 동일한 문제가있었습니다. 첫째, 올바르게 구문 분석되지 않은 데이터가 무엇인지 찾아 - 내 경우

NSString *str = [[NSString alloc] initWithData:retrievedData encoding:NSUTF8StringEncoding]; 

했던 내 경우에는 이유가 있었다 - 서버가 연속으로 몇 socket.write()의를 보낸 경우 - 모든 데이터는이 하나의 단일 JSON으로 분석 할 수 없습니다 물론

{first:json}{second:json}.. 

처럼, 하나 개의 덩어리로받은, 그래서 나는 구분 기호를 도입해야하고, 올바른 덩어리로 수신 버퍼를 분할합니다.

1

이 조금 늦게 아무것도하지만, 내가 이런 짓까지 온라인 나를 위해 일한 있습니다 :

NSString * dataInString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 

NSRange range = [dataInString rangeOfString:@"}" options:NSBackwardsSearch]; 

if(range.location != NSNotFound) 
    dataInString = [dataInString substringWithRange:NSMakeRange(0,range.location+1)]; 

항상 그 이후로 일했다.

0

동일한 오류가 발생했습니다. 문제는 내 서버가 내 json 응답에 몇 가지 추가 선을 연결하는 것이므로 브라우저에서 응답을받을 때 표시되지 않습니다. 터미널에서 curl을 사용하면 실제 출력을 볼 수 있습니다. 해킹은 여분의 문자를 잘라 버리는 것이 었습니다. json에는 배열이나 사전이 있습니다. 당신이 쓰레기 데이터로부터 문자열이 깨끗한 일단 다시 데이터로 변환 할 수 있습니다, 당신의 JSON 구조에 따라 (답 위 등)의 코드를 사용할 수 있지만 2 호선

NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 
NSRange range = [str rangeOfString:@"}" options:NSBackwardsSearch]; // } for dictionary, ] for array 

if(range.location != NSNotFound) 
str = [str substringWithRange:NSMakeRange(0,range.location+1)]; 

에 주석을 찾습니다.

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; 

이제이 데이터에서 배열 또는 사전을 가져올 수 있습니다.

id jsonObject = [NSJSONSerialization 
       JSONObjectWithData:data 
       options:kNilOptions error:&error]; // i used id to be general, you can use array or dictionary structure or later cast this object to as per json