2009-10-05 31 views
5

私はJSONについてほとんど何も知っていないので、iPhoneのみを使用してサーバーにリクエストを送信し、そこからデータを読み込む必要があります。JSON IPHONE:JSONリクエストを送信してサーバーからデータを取得する方法は?

私はjason-framework を使用しようとしましたが、ドキュメントを読み終えた後、オブジェクトを作成してリクエストで送信する方法を見つけることができませんでした。だから私はここで見た別のコードをSOに適用することに決めました。

私が必要とするオブジェクトはこれです:

{ "コード":XXX}ここで

私は問題を抱えています。このxxxはNSDataなので、このデータを文字列に変換してからこの文字列を使用してオブジェクトを作成し、リクエストでこれを送信する必要があると思われます。

サーバ応答もJSONオブジェクトでは、フォームで

{「回答」:「YYY」} YYYは10000と99999

の間の数であり、これは私が持っているコードであります遠い

- (NSString *)checkData:(NSData) theData { 
    NSString *jsonObjectString = [self encode:(uint8_t *)theData length:theData.length];  
    NSString *completeString = [NSString stringWithFormat:@"http://www.server.com/check?myData=%@", jsonObjectString];        
    NSURL *urlForValidation = [NSURL URLWithString:completeString];    
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];       
    [validationRequest setHTTPMethod:@"POST"];    
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil]; 
    [validationRequest release]; 
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding]; 
    NSInteger response = [responseString integerValue]; 
    NSLog(@"%@", responseString); 
    [responseString release]; 
    return responseString; 
} 


- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length { 
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    NSMutableData *data = [NSMutableData dataWithLength:((length + 2)/3) * 4]; 
    uint8_t *output = (uint8_t *)data.mutableBytes; 

    for (NSInteger i = 0; i < length; i += 3) { 
     NSInteger value = 0; 
     for (NSInteger j = i; j < (i + 3); j++) { 
      value <<= 8; 

      if (j < length) { 
       value |= (0xFF & input[j]); 
      } 
     } 

     NSInteger index = (i/3) * 4; 
     output[index + 0] = table[(value >> 18) & 0x3F]; 
     output[index + 1] =     table[(value >> 12) & 0x3F]; 
     output[index + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; 
     output[index + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; 
    } 

    ret 

    urn [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; 
} 

このコードはすべてエラーです。またはBAD URLまたはjava例外。

このコードで何が問題になっていますか?

あなたたちはJSON-フレームワークを使用して、別の解決策を与えることを希望する場合(「ここに私のNSDataを文字列に変換」、「コード」)というペアを使用してオブジェクトをエンコードする方法を教えてください...

感謝助けを求めて

答えて

17

JSONフレームワークは、配列、辞書、文字列、数値、ブール値の変換をサポートしています。だからあなたがしたいのは、あなたのデータをこれらのフォーマットの1つに変換することです。あなたのデータはNSDataのであるので、最も簡単な方法はでそれを変換することです:バッファに何があるかに応じて、

NSString* stringData = [[NSString alloc] initWithData:yourData 
              encoding:NSUTF8StringEncoding]; 

(とサーバーがそれを扱うことができる場合)は、Base64にしたいこと(あなたはドン場合http://www.cocoadev.com/index.pl?BaseSixtyFourをチェック」の結果をエンコード便利なコンバータがあります)。 NSDataからBase64でエンコードされた文字列に直接進むこともできます。

次に(最後の工程から)キーcodestringDataで一つの項目との辞書を作成する:

NSDictionary* jsonDictionary = [NSDictionary dictionaryWithObject:stringData 
                  forKey:@"code"]; 

これは容易にJSONに変換することができます。 {"code" : "{yourstringdata}"; }: - のようなものを

NSString* jsonString = [jsonDictionary JSONRepresentation]; 

はそれをダンプして、あなたのJSON文字列が表示されます:ちょうど使用し、その後、あなたのコードヘッダーでJSON.hをインポートします。これをサーバーに送る最も簡単な方法は、ASIHTTPRequestライブラリーをPOSTメソッドで使用することです。

あなたが戻ってサーバからの結果を得るJSONフレームワークが辞書に戻ってそれを解析することができ、その後、あなたはあなたが必要とするデータ出ることができたら:

NSDictionary* responseDict = [yourJSONResponseStringFromServer JSONValue]; 
NSNumber* answerNum = (NSNumber *) [responseDict objectForKey:@"answer"]; 
int answer = [answerNum intValue]; 
+0

感謝を!!!!!!それでおしまい!ASIHTTPRequestライブラリのドキュメントはかなり不完全で表面的です(あなたのせいではありません)が、あなたの指示を使って動作させることができました。完璧!あなたはD男です! – SpaceDog

+0

それはあなたのために働いてうれしい。 ASIHTTPRequestをあきらめないでください。一度あなたがそれを取得するとかなり簡単です。唯一のことは、setDidFinishSelector/setDidFailSelectorメソッドを提供し、ネットワークに障害が発生したときに通知を受け取るようにデリゲートを設定することを忘れないでください。あまりにも多くのセルデッドゾーンがあります。 – Ramin

関連する問題