JSON IPHONE: Как отправить запрос JSON и получить данные с сервера? - PullRequest
5 голосов
/ 05 октября 2009

Я почти ничего не знаю о JSON, и мне нужно отправить запрос на сервер и прочитать поступающие с него данные, используя только iPhone.

Я пытался использовать jason-framework чтобы сделать это, но после прочтения документации я не смог понять, как построить объект и отправить его по запросу. Поэтому я решил адаптировать другой код, который я видел здесь, на SO.

Объект, который мне нужен, это:

{"code": xxx}

Здесь у меня проблема. Этот xxx является NSData, поэтому я подозреваю, что мне нужно преобразовать эти данные в строку, затем использовать эту строку для создания объекта и отправить его по запросу.

ответ сервера также является объектом JSON в форме

{"answer": "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-framework, расскажите, пожалуйста, как кодировать объект с использованием этой пары («код», «мои NSData здесь преобразованы в строку») ...

спасибо за любую помощь.

1 Ответ

17 голосов
/ 05 октября 2009

JSON Framework поддерживает преобразование массивов, словарей, строк, чисел и логических значений. Итак, что вы хотите сделать, это конвертировать ваши данные в один из этих форматов. Поскольку ваши данные являются 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...