2009-10-05 89 views
5

我對JSON幾乎一無所知,我只需要向服務器發送請求並從中讀取數據。JSON IPHONE:如何發送JSON請求並從服務器中提取數據?

我試圖使用jason-framework 來做到這一點,但在閱讀文檔後,我無法弄清楚如何構建對象並在請求中發送它。所以我決定修改我在這裏看到的另一個代碼。

我所需要的對象是這樣的:

{ 「代碼」: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框架支持轉換數組,字典,字符串,數字和布爾值。所以你想做的是將你的數據轉換爲這些格式之一。由於數據NSData的最簡單的方法是將其與轉換:

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

根據什麼是在緩衝區(如果您的服務器可以處理它),你可能要爲Base64編碼的結果(檢查http://www.cocoadev.com/index.pl?BaseSixtyFour如果你不」方便的轉換器)。你甚至可以直接從NSData到Base64編碼的字符串。

現在創建一個字典借助具有密鑰code一個項目和值stringData(來自最後步驟):

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

這可以容易地轉化爲JSON。就在你的代碼頭部導入JSON.h,然後使用:

NSString* jsonString = [jsonDictionary JSONRepresentation]; 

轉儲出來,你會看到你的JSON字符串 - 是這樣的:{"code" : "{yourstringdata}"; }。將它發送到服務器最簡單的方法是使用POST方法使用ASIHTTPRequest庫。

一旦你得到的結果從服務器返回的JSON框架可以解析它放回一本字典,然後你可以得到你所需要的數據:

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

感謝!!!!!!而已!ASIHTTPRequest庫文檔相當不完整和膚淺(不是你的錯),但是我設法使用你的指令使它工作。完善!你是D人! – SpaceDog 2009-10-05 18:13:50

+0

很高興爲你效勞。不要放棄ASIHTTPRequest。一旦你掌握了它,它是非常簡單的。唯一的問題是,不要忘記提供setDidFinishSelector/setDidFailSelector方法並設置委託,以便在聯網失敗時收到通知。太多的細胞死亡區在那裏。 – Ramin 2009-10-05 21:12:40

相關問題