5

更新: JSONlintを使用してサーバーから返された JSON 形式をテストしましたが、問題ありません。

JSON データを返す PHP スクリプトへの AFNetworking 呼び出しで、NSJSONSerialization で例外が発生します。ここで同じ問題に関する他の質問を見て、それらの解決策を試しましたが、まだエラーが発生しています。

次の行でクラッシュします。

 NSError *e = nil;
 NSMutableArray *jsonArray = 
 [NSJSONSerialization JSONObjectWithData: jsonData 
                                 options: NSJSONReadingMutableContainers 
                                   error: &e];

エラーログ:

2012-03-19 18:10:41.291 imageUploader[3538:207] *キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。理由: '-[__NSCFArray バイト]: 認識されないセレクターがインスタンス 0x6867430 に送信されました'

ブラウザからphpスクリプトを呼び出すと、JSONデータは次のようになります。

[{"ユーザー":"binky","パス":"binky-0a96f9aab5267c8.jpg","インデックス":"101"},{"ユーザー":"binky","パス":"binky-9cf844252c28553.jpg ","index":"102"},{"user":"binky","path":"binky-d6c749d25d33015.jpg","index":"103"}]

データの NSLog は次のようになります。

( { インデックス = 101; パス = "binky-0a96f9aab5267c8.jpg"; ユーザー = binky; }, { インデックス = 102; パス = "binky-9cf844252c28553.jpg"; ユーザー = binky; }, { インデックス = 103; パス = "binky-d6c749d25d33015.jpg"; ユーザー = binky; } )

最後に、有効な JSON データがあることを確認するテストを行います。

         if ([NSJSONSerialization isValidJSONObject: jsonData]){
             NSLog(@"Good JSON \n");
         }

そのため、エラーの原因がどこにあるのかわかりません。少し助けて?

// AFNetworking 操作 + ブロック

    AFJSONRequestOperation *operation = 
    [AFJSONRequestOperation JSONRequestOperationWithRequest:myRequest 
     success:^(NSURLRequest *request, NSHTTPURLResponse *response, id jsonData) {

         NSLog(@"Success JSON data:\n %@ \n", jsonData); //log data

         if ([NSJSONSerialization isValidJSONObject: jsonData]){
             NSLog(@"Good JSON \n");
         }

         NSError *e = nil;
         NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData: jsonData options: NSJSONReadingMutableContainers error: &e];

         if (!jsonArray) {
             NSLog(@"Error parsing JSON: %@", e);
         } else {
             for(NSDictionary *item in jsonArray) {
                 NSLog(@"Item: %@", item);
             }
         }

         [self.navigationController popToRootViewControllerAnimated:YES];
     } 
     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

         NSLog(@"Error: %@", error);
         [self.navigationController popToRootViewControllerAnimated:YES];
     }];
4

1 に答える 1

7

どうやら JSONObjectWithData は、配列ではなく NSData を想定しています。id jsonData は、json 文字列の内容を表す配列のようです。明らかに、とにかく配列を期待しています。

どういうわけか、あなたはそれを2回やっています。それ以外の

 NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData: jsonData options: NSJSONReadingMutableContainers error: &e];

あなたは単に使用することができます

NSMutableArray *jsonArray = [NSMutableArray arrayWithArray:jsonData];

または、変更可能である必要がない場合:

NSArray *jsonArray = (NSArray *) jsonData;

ただし、それが本当に jsonData の配列であるかどうかを常にテストする必要があります。json 文字列内の構造に応じて、エラーの場合は NSDictionary または nil になる可能性があります。

于 2012-03-19T23:14:57.120 に答える