【问题标题】:JSON IPHONE: How to send a JSON request and pull the data from a server?JSON IPHONE:如何发送 JSON 请求并从服务器中提取数据?
【发布时间】:2010-12-03 20:20:31
【问题描述】:

我对 JSON 几乎一无所知,我需要向服务器发送请求并读取来自它的数据,仅使用 iPhone。

我尝试使用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[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    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];
}

所有这些代码给我的都是错误。或错误的 URL 或 java 异常。

这段代码有什么问题?

如果你们更喜欢使用 json 框架提供另一种解决方案,请告诉我如何使用该对(“代码”、“我的 NSData 此处转换为字符串”)对对象进行编码...

感谢您的帮助。

【问题讨论】:

    标签: iphone objective-c json iphone-sdk-3.0


    【解决方案1】:

    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}"; }.将其发送到服务器的最简单方法是使用 ASIHTTPRequest 库和 POST 方法。

    一旦您从服务器返回结果,JSON 框架可以将其解析回字典,然后您就可以获取所需的数据:

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

    【讨论】:

    • 谢谢!!!!!!而已! ASIHTTPRequest 库文档非常不完整且肤浅(不是您的错),但我设法使用您的说明使其工作。完美的!你是D人!
    • 很高兴它对你有用。不要放弃 ASIHTTPRequest。一旦掌握了窍门,它就非常简单。唯一的事情是,不要忘记提供 setDidFinishSelector/setDidFailSelector 方法并设置委托,以便在网络失败时收到通知。那里有太多的细胞死区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多