2013-01-05 24 views
36

私はサーバーにデータを送信し、JSON形式で応答を受け取ろうとしています。問題は、サーバが「成功」または「失敗」を返さなければならないが、「(null)」を返すことである。ここでJSON(iOS)を使用したCocoaエラー3840

が返されるエラーです:

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=XXXXXXXXX {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

は、それはエラーがサーバースクリプトであることは可能ですか?

ここに私の機能は、データを送信し、応答を受信します:

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

答えて

31

あなたは[NSJSONSerialization JSONObjectWithData:options:error:]にオプションNSJSONReadingAllowFragmentsを渡していない限り、サーバーからの応答が配列かであるトップレベルのコンテナを持つ有効なJSONでなければなりません辞書。例えば

{ "response" : "Success" } 

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

+0

を使用して

はミスがPHPコードであるかもしれないということですか? – iosdevrocks

+0

私はJSONPなので、JSONですが、コールバックのような名前のメソッドをラップしています(_allあなたのJSONはここにあります)。 – RickiG

+0

@iosdevrocks、私の場合、問題はPHPコード – Alex

1

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

8

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

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

だから、あなたのサーバが返ってきたものは何でもありません。

また、NSJSONReadingAllowFragmentsオプションを使用しても、JSONを強制的に使用することができます。あなたが言っている何を、

AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments]; 
+1

また、AFHTTPResponseSerializer(代わりにAFJSONResponseSerializer)を試す必要があります。わたしにはできる –

関連する問題