-2

NSURLConnectionを使用してJSONリクエストを行うと、「認識されないセレクター」エラー[__NSCFDictionarylength]が発生します。

ヘッダー内のリクエストを、それが機能するUTF8Stringとして送信することから、何らかの理由でNSDataを必要とする本文に変更しました。最終的にヘッダーのデータが多すぎるため、この変更を行いました。

なぜこのエラーが発生するのですか?どうすれば修正できますか?これはどういうわけかメモリ内のオブジェクトに問題がありますか?私は困惑しています。

    -(void)initWebserviceWithJSONRequest:(NSData *)jsonRequest url:(NSURL *)url
    {
       //initialize the responseData property //
       self.responseData = [[NSMutableData alloc] init];
       NSError *error = nil;
       NSMutableData *requestData = [[NSMutableData alloc] init];
       requestData = [NSJSONSerialization JSONObjectWithData:jsonRequest options:NSJSONWritingPrettyPrinted error:&error];
       // create the URL request that will be passed to the NSURLConnection class // 
       NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:60];

       // set up the request values //
       [request setHTTPMethod:@"POST"];
       // line below included to show that there is a length available for requestData
       int jsonLength = requestData.description.length;// This works because it's .description.length
       [request setHTTPBody:requestData ];

       // Make a connection //
       self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
    }

このメソッドの呼び出しは次のようになります。

    NSData *jsonData = [[NSData alloc] initWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
    [service createWebserviceWithJSONRequest:jsonData url:loginURL];

そして、これが私が本文で送信しているjsonです:

    {
        CURRENTDATETIME = "2012-11-16 18:11:26";
        CURRENTUSERTOKEN = "";
        REQUESTDATA = "{\"USERNAME\":\"testUserName\", \"PASSWORD\":\"TestPassword\", \"APPVERSION\":\"0.001.1\", \"CARRIER\":\"ATT\", \"DEVICENAME\":\"iPad Simulator\", \"DEVICETOKEN\":\"9A384B42-7766-55AE-B61D-0AAB74A4304B\", \"OSVERSION\":\"5.1\", \"LATITUDE\":10.72182, \"LONGITUDE\":-10.148127, \"ISWIFI\":\"true\", \"BATTERYLEVEL\":42.2, \"SCREENHEIGHT\":1024, \"SCREENWIDTH\":768, \"SCREENPPI\":132, \"SIGNALSTRENGTH\":4, \"APPPACKAGE\":1003}";
        TRANSACTIONDATETIME = "2012-11-16 18:11:26";
        TRANSACTIONUSERTOKEN = "";
    }

注xcodeバージョン4.3.2(4E2002)を使用しています

そしてiOSシミュレータバージョン5.1(272.21)

Mac OSX10.7.5の場合

4

2 に答える 2

2
requestData = [NSJSONSerialization JSONObjectWithData:jsonRequest options:NSJSONWritingPrettyPrinted error:&error];

JSONObjectWithData:options:error:を返さないので、間違っていNSDataます。

返されるタイプは、に含まれているものによって異なります(jsonRequest、、、などなど)。NSDictionaryNSArray

jsonRequestここでの問題は、オブジェクトをメソッドに単純に渡してみませんsetHTTPBodyか?

于 2013-01-21T21:32:03.043 に答える
1

一般に、JSONを介してデータを送信する場合、送信のためにJSON文字列に変換する電話(またはその他)に比較的複雑な構造があります。

JSON文字列はNSDictionariesとNSArraysに非常によく「マッピング」されるため、電話側のデータをNSDictionariesとNSArraysの構造に取得し、「ルート」辞書/配列をdataWithJSONObject(または、より適切には、別のJSONパーサー/シリアライザーのブランド)。Apple APIは、使用するネットワークインターフェイスに応じて、直接送信するか、NSStringに変換して送信できる変換からNSDataオブジェクトを返します。

JSONデータを取得したら、それを送信してJSONObjectWithData、アプリが理解できるNSArrayとNSDictionariesの「ネスト」に変換します。

入力と出力が逆になっています。

于 2013-01-21T22:25:27.577 に答える