2012-03-29 1 views
3

으로 NSData이 유효한 JSON인지 확인하는 방법이 있습니까? 어떤 이유로 API가 잘못된 JSON을 반환하면 응용 프로그램에 오류가 발생하는 것을 원하지 않습니다.API의 응답이 유효한지 확인 JSON

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
NSError *error; 
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 

답변

26

"오류가 발생하지 않습니다. JSON이 유효하지 않은 경우이 값은 nil을 반환합니다. 이 유효한 경우 따라서 시험은 JSON이 될 것입니다 볼 수 있습니다 :

NSError *error; 
if ([NSJSONSerialization JSONObjectWithData:data 
            options:kNilOptions 
             error:&error] == nil) 
{ 
    // Handle error 
} 

를 그 다음은 무엇이 잘못되었는지 볼 수 error을 확인할 수 있습니다 nil를 반환 할 경우.

+0

오류 코드로 오류를 잡는 방법을 보여주는 예제 코드를 제공해 주시겠습니까? –

0

실제로 NSJSONSerialization으로 개체를 만들지 않고 데이터를 확인하는 방법은 없습니다. 나는 그것을 try-catch에 넣을 것이다. catch 블록에서 끝나면 유효한 JSON이 아닙니다.

EDIT : 생각해 보니, 오류가 발생하면 '오류'는 오류 개체입니다. 따라서 아무 것도 던지지 않더라도 데이터가 유효한지 확인할 수 있습니다.

7

NSJSONSerialization 클래스는 정확히이 작업을 수행하는 방법 (편집 : 더는하지 않습니다 ...)이

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
BOOL isValid = [NSJSONSerialization isValidJSONObject:jsonObj]; 

편집 : (hypercrypts '코멘트 후)

Hypercrypt가 옳다. (나는 정말로 그것을 놓친 것을 이해할 수 없다.) ... 나의 대답은 작동하는 것처럼 보이지만, 틀린이다. isValidJSONObject: 메서드가 수행하는 작업은 객체가 JSON으로 직렬화 될 수 있는지 확인하는 것이지 다른 방법으로는 수행 할 수 없는지 확인하는 것입니다. 그래서 그의 대답은 당신이 찾고있는 것입니다. JSON 페이로드에서 변경 가능한 복사본을 가져 와서 변경 한 다음 나중에 JSON 문자열로 다시 직렬화하려고 시도했는지 확인하고 싶다면이 메서드를 사용할 수 있습니다. 그러나 결론은 하이퍼 크립트의 대답이 올바른 것이며 나는 그의 대답을 내 것이 아니라 올바른 것으로 표시하는 것이 공평한 것이라고 생각한다. 어쨌든, 혼란에 대해 미안하네요. @hypercrypt는 그것을 지적 해 주셔서 감사합니다 :)

+2

그건 - [NSJSONSerialization isValidJSONObject :]'이 아닙니다. 임의의 배열 또는 사전이 JSON 문자열로 변환 될 수 있는지 확인하는 것입니다. – hypercrypt

+0

@hypercrypt 감사합니다. 내 편집 된 답변을 확인해 주셔서 감사합니다. – Alladinian

+0

Thanks @hypercrypt -이 문서는별로 좋지 않습니다. 나는 미쳤다고 생각했다. – ferdil