web-dev-qa-db-ja.com

JSONを使用したCocoaエラー3840(iOS)

サーバーにデータを送信し、JSON形式で応答を受信しようとしています。問題は、サーバーが「成功」または「失敗」を返す必要があるが、「(null)」を返すことです。

返されるエラーは次のとおりです。

Error Domain = NSCocoaErrorDomain Code = 3840 "操作を完了できませんでした。(Cocoaエラー3840.)"(JSONテキストは配列またはオブジェクトで開始されず、フラグメントを設定できないオプションがあります。)UserInfo = XXXXXXXXX {NSDebugDescription = JSON text配列またはオブジェクトで開始しなかった、フラグメントが設定されないようにするオプション。}

エラーがサーバースクリプトにある可能性はありますか?

データを送信して応答を受信するための私の機能は次のとおりです。

- (void) putData:(NSString *)parameter valor:(NSString *)valor {

    NSString *rawString = [NSString stringWithFormat:@"%@=%@", parameter, valor];
    NSData *data = [rawString dataUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:@"http://www.xxx.xxx/xxx.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"PUT"];
    [request setHTTPBody:data];
    NSURLResponse *response;
    NSError *error;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
    NSLog(@"responseData: %@ error: %@", json, error);
}
38
iosdevrocks

オプションNSJSONReadingAllowFragments[NSJSONSerialization JSONObjectWithData:options:error:]に渡さない限り、サーバーからの応答は、配列またはディクショナリーである最上位のコンテナーを持つ有効なJSONでなければなりません。

例えば:

    { "response" : "Success" }

追伸可変辞書が必要な場合は、オプションにNSJSONReadingMutableContainersも含める必要があります。

34
Stu

サーバーからの応答に有効なJSONが含まれていない可能性があります。

技術的には、JSONオブジェクトは「配列」または「オブジェクト(辞書)」で始まる必要があります。

したがって、サーバーが返すものは何でもありません。

また、NSJSONReadingAllowFragmentsオプションを使用して、JSONを強制的に消費させることができます。

を使用して、

AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
10
Vandit Mehta

IOSデバイスでVPNに接続している場合、この問題が発生する可能性があります。

1
codeburn