8

現在、データ転送に JSON を使用し、永続ストレージに Core Data を使用するアプリ (ターゲット iOS 6、ARC 対応) を作成しています。JSON データは、json_encode を介して PHP スクリプトによって MySQL データベースから生成されます。

私の問題は、特定のテーブルのデータで次のコードが失敗することです。

- (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 エラーでクラッシュし、Instruments はゾンビが検出されたと言っています。これは、メッセージを送信するオブジェクトの一部が nil であることを意味することはわかっていますが、それを修正する方法がわかりません... それが Instruments が言わなければならないことです:

#   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 値: 他のテーブルでは問題ありません

誰かがアイデアを持っていますか?

4

3 に答える 3

11

のバグ/欠点のようNSJSONSerializationです。この問題は、エスケープされた Unicode 文字 (freie_pl\u00e4tzeではなくfreie_plätze) が原因で発生します。2 つのオプションがあります -

  1. エスケープされた Unicode を実際の Unicode 文字に変換します。このSOの答えを試してください
  2. JSONKitなどの別の JSON エンジンを使用します。JSONKitよりもパフォーマンスが高いとも主張していますNSJSONSerialization
于 2012-10-11T15:43:02.363 に答える
4

この質問に回答があったことは知っていますが、初心者の中には私と同じ問題を抱えていて、この質問にたどり着く人もいると思います。

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

迷惑なことに、フォーマットエラーは発生しませんでした。問題の原因となった JSON の例を次に示します。

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

この問題を解決するには、同じレベルのすべてのオブジェクトが異なる名前を持つようにする必要がありました。

于 2012-12-03T13:20:38.703 に答える
1

今日、NSJSONSerialization をテストしました。iOS7.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);
于 2014-04-24T16:40:47.897 に答える