2012-10-11 2 views
8

현재 데이터 전송을 위해 JSON을 사용하고 영구 저장을 위해 코어 데이터를 사용하는 앱 (대상 iOS 6, ARC 사용)을 작성 중입니다. JSON 데이터는 json_encode를 통해 PHP 스크립트에 의해 MySQL 데이터베이스에서 생성됩니다.NSJSONSerialization 결과는 EXC_BAD_ACCESS입니다.

내 문제는 특정 테이블의 데이터로 다음과 같은 코드가 실패 할 수 있습니다 :

- (NSDictionary *)executeFetch:(NSString *)query 
{ 
    NSURL *requesturl = [NSURL URLWithString:[query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

    NSError *dataError = nil; 
    self.jsonData = [NSData dataWithContentsOfURL:requesturl options:kNilOptions error:&dataError]; 

    NSError *error = nil; 
    self.jsonSerializationResult = [NSJSONSerialization JSONObjectWithData:self.jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error]; 

    return self.jsonSerializationResult; 

} 
프로그램은 항상 self.jsonSerializationResult 및 악기가 좀비가 있다고 말한다 말한다 라인에 EXC_BAD_ACCESS 오류로 충돌

감지 됨. 나는 이것이 어떤 객체 나에 무기 호입니다 메시지를 보낼 것을 의미 알지만, 그 악기가 말을하는거야 ... 그것을 해결하는 방법을 찾을 수 없습니다 :

# Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller 
0 0xa1b8a70 CFString (mutable) Malloc 1 00:01.603.081 32 Foundation -[NSPlaceholderMutableString initWithBytesNoCopy:length:encoding:freeWhenDone:] 
1 0xa1b8a70 CFString (mutable) Release 0 00:01.603.137 0 Foundation newJSONValue 
2 0xa1b8a70 CFString (mutable) Zombie -1 00:01.603.259 0 Foundation newJSONString 

내 프로그램은 모든 JSON와 함께 작동 이 일을 제외하고 출력 :

{ 
    "termin":[ 
     { 
     "termin_id":"17", 
     "veranstaltung_id":"20", 
     "beginn":"2012-09-28 17:00:00", 
     "ende":"2012-09-28 18:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"18", 
     "veranstaltung_id":"26", 
     "beginn":"2012-09-28 19:00:00", 
     "ende":"2012-09-28 20:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"19", 
     "veranstaltung_id":"26", 
     "beginn":"2012-09-28 21:00:00", 
     "ende":"2012-09-28 22:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"20", 
     "veranstaltung_id":"46", 
     "beginn":"2012-09-28 19:00:00", 
     "ende":"2012-09-28 20:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"24", 
     "veranstaltung_id":"66", 
     "beginn":"2012-09-28 22:00:00", 
     "ende":"2012-09-28 22:30:00", 
     "freie_pl\u00e4tze":"120" 
     } 
    ] 
} 

내가 공급 몇 가지 가능한 오류에 대해 생각하지만 아무도 것으로 보인다 책임 :

  • jsonData 또는 jsonSerializationResult는 nil이 될 수있다 : 그들은
  • 없습니다
  • PHP 생성 무효 JSON : 발리와 그 검사
  • 널 (null) 값 : 다른 테이블

사람이 아이디어를 구하셨하지 문제?

답변

11

NSJSONSerialization과 관련된 버그/단점처럼 보입니다. 이 문제는 이스케이프 처리 된 유니 코드 문자 (freie_plätze 대신 freie_pl\u00e4tze)로 인해 발생합니다. 두 가지 옵션이 있습니다.

  1. 이스케이프 된 유니 코드를 실제 유니 코드 문자로 변환하십시오. 시도하십시오 this SO answer
  2. 다른 JSON 엔진을 사용하십시오 (예 : JSONKit). JSONKitNSJSONSerialization보다 성능이 좋다고 주장합니다.
+0

대단히 감사합니다. 그것은 내가 실패한 데이터와 작업 중 하나의 차이점을 조사하면서 변경하지 않은 유일한 것입니다 ...놀랍게도 이스케이프 된 문자는 값이 아닌 사전 키에만 문제가되는 것 같습니다 ... –

+0

BTW, NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves' 옵션. 이것도 당신의 경험입니까? – Rob

+0

안녕하세요, AFNetworking 코드 주석입니다. :) 감사합니다. 정말 도움이됩니다! – skywinder

4

나는이 질문에 답을 얻었으나 일부 ​​초보자도 나와 같은 문제를 가지고이 질문에 참여할 수 있다고 생각합니다.

EXC_BAD_ACCESS 메시지가 잘못된 JSON으로 인해 발생했습니다. JSON을 사전으로 변환 할 때 문제를 일으키는 Object에 동일한 이름을 실수로 사용했기 때문에.

annoyingly 서식 오류가 발생하지 않았습니다.

"levels" : { 
    "level1": { 
     .... 
    }, 
    "level1": { 
     ... << All objects should have different names. This should be called level2. 
    }, 
    "level3": { 
     ... 
    } 

내가 같은 수준의 모든 객체가 다른 이름을 가지고 있는지 확인해야했던 문제를 해결하려면 다음은 문제를 일으킨 그 JSON의 예입니다.

1

오늘 NSJSONSerialization을 테스트했습니다. iOS 7.1. 그것은 효과가있다. 문제는 발견되지 않았습니다. Apple이 문제를 해결 한 것처럼 보입니다.

NSString* jsonString = @"{ \"freie_pl\\u00e4tze\":null}"; 

NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 

NSError *error = nil; 
NSDictionary* jsonSerializationResult = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error]; 

NSLog(@"%@", jsonSerializationResult);