2012-10-11 14 views
8

現在、私は、データ転送にJSON、永続ストレージにCore Dataを使用するアプリケーション(Target iOS 6、ARC enabled)を作成しています。 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で動作します。私は、これは私がメッセージを送信するいくつかのオブジェクトがnilであるが、私はそれを修正する方法を見つけることができません...それは、楽器が言っているものだということを意味していることを知っていますこの1以外の出力:

{ 
    "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のバグ/欠点のようです。この問題は、エスケープされたUnicode文字(freie_plätzeではなくfreie_pl\u00e4tze)によって発生します。 2つのオプションがあります。

  1. エスケープされたUnicodeを実際のUnicode文字に変換します。お試しくださいthis SO answer
  2. JSONKitなどの別のJSONエンジンを使用してください。 JSONKitNSJSONSerializationよりも優れていると主張する。
+0

ありがとうございました!これは、失敗したデータと作業中のデータの違いを調べながら、私が変更しなかった唯一のものでした...驚いたことに、エスケープされた文字は、値ではなく、辞書のキーの問題であるように思えます... –

+0

BTW、私は 'NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves'オプション。これもあなたの経験ですか? – Rob

+0

こんにちは 'AFNetworking'コードコメントから。 :) ありがとう、本当に助けて! – skywinder

4

私はこの質問が回答されていることを知っていますが、私はいくつかの初心者が私と同じ問題を抱えているかもしれないと思います。

EXC_BAD_ACCESSメッセージは、不正な形式のJSONが原因です。 JSONを辞書に変換する際に問題を引き起こすObjectに同じ名前を誤って使用したためです。

annoyinglyそれはフォーマットエラーを引き起こさなかった。ここでは、問題の原因となったJSONの例です。

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

私は同じレベルのすべてのオブジェクトは異なる名前を持っていることを確認しなければならなかった問題を修正するには。

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);