2009-10-05 85 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