2011-12-27 4 views
1

나는 내 POST 작업에 다음과 같은 응답을 제공하는 WCF 서비스 생성 결과, 내가 뭘 잘못하고 있니?NSJSONSerialization 분석 응답 데이터

NSError *jsonParsingError = nil; 
NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError]; 

NSLog(@"jsonList: %@", jsonArray); 

if(!jsonArray) 
{ 
    NSLog(@"Error parsing JSON:%@", jsonParsingError); 
} 
else 
{ 
    // Exception thrown here.   
    for(NSDictionary *item in jsonArray) 
    { 
     NSLog(@"%@", item); 
    } 
} 
+0

어떤 유형의 예외가 발생합니까? –

+0

NSLog 출력이 jsonArray에서 출력 되나요? – Jeremy

+0

@ Jacob-Relkin - Exception : EXC_BAD_INSTRUCTION – mservidio

답변

3

, 당신은 JSON 데이터에 따옴표를 탈출하지 않아야합니다. 그러나 또한 반환 문자열을 인용했습니다. 이렇게하면 JSON 문자열이 아닌 객체가됩니다. 따라서 디코드 할 때 문자열을 변경할 수있는 배열이 아니므로 반복 속도를 높이려고 할 때 오류가 발생하는 이유는 무엇입니까? 문자열을 빠르게 반복합니다.

실제 JSON은 다음과 같아야합니다. [{"Id":1,"Name":"Michael"},{"Id":2,"Name":"John"}]. 따옴표가 없으며 탈출구가 없습니다. JSON 객체 주위의 따옴표를 제거하면 앱이 더 이상 충돌하지 않지만 조작 된 데이터 (이탈)에 대한 JSON 역 직렬화 오류가 발생합니다.

+0

Jason에게 감사드립니다. 그거였다. 나는 WCF 서비스를 잘못 코딩했다는 것을 깨달았다. 반환 형식은 문자열이 아니고 List <>이어야하며 ResponseFormat은 json이어야하며 나머지는 자체적으로 처리됩니다. 실제 문자열을 반환했기 때문에 모든 것이 이스케이프 처리되고 전체 문자열이 인용되었습니다. – mservidio

3

잘못된 기초 개체를 사용하고 있습니다. NSMutableArray를 NSDictonary로 변경해보십시오.

NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError]; 

사람 : :에서

제레미 지적

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError]; 
+0

그냥 같은 장소에서 SIGABRT 오류가 발생했습니다 ... – mservidio

+0

죄송합니다, 내 대답은 예외가 발생하지 않는다고 가정합니다. 그러나 위의 설명에서 예외가 발생했다고 명시 했으므로 json의 형식이 잘못되었을 가능성이 큽니다. 귀하의 응답이 실제로는 도피를 보내지 않아야합니다. – Jeremy

+0

그 점을 지적 해 주셔서 감사합니다. 피들러에서 내 출력은 "{\"이름 \ ": \"이름 \ ": \"마이클 \ "}, \"ID \ ": 2, \"이름 \ ": \"존 \ "} ] ", 탈출했다. 응답에서 이스케이프를 보내지 않도록 wcf 서비스를 업데이트합니다. – mservidio

0

NSJSONSerialization을 사용하여 구문 분석하는 것은 쉽지만 사전을 처리하는 대신 클래스 개체에 JSON 값을 직접 구문 분석 할 수있는 작은 프레임 워크를 만들었습니다. 잘 보시면 도움이 될 것입니다 : https://github.com/mobiletoly/icjson