Подтвердить что ты не робот

Запрос AFSetworking JSON с булевым

Я пытаюсь отправить запрос JSON с использованием AFNetworking и проблема с преобразованием значений в json-форму {"value": true}. Вместо этого я получаю: {"value": 1}

Вот в основном, как я создаю запрос:

NSMutableURLRequest *request =
    [self.httpClient requestWithMethod:@"POST"
                                  path:url
                            parameters:@{@"value": @YES}];

AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request ...];
    [operation start];

Я пропустил что-то тривиальное здесь?:)

4b9b3361

Ответ 1

Короткий ответ: Убедитесь, что вы используете последнюю версию AFNetworking. Это все, что я вижу как проблему, основанную на коде, который вы предоставили.

Длинный ответ: Я попытался воспроизвести проблему, которую вы описываете, с самыми последними версиями AFNetworking, и я не мог. Я вошел в AFNetworking, чтобы узнать, как выполняется кодирование JSON. AFHTTPClient.m: 442 использует NSJSONSerialization для кодирования запросов JSON. Я придумал следующий код для проверки проблемы:

NSError* error = nil;
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:@{@"value" : @YES} options:0 error:&error];
NSLog(@"Resulting JSON:\n\n%@\n", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);

выходы:

{"value":true}

Итак, @YES должен это сделать. В качестве примечания, убедитесь, что не использовать @(YES) в вашем коде, поскольку он будет выводиться как 1 вместо true.

NSError* error = nil;
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:@{@"value" : @(YES)} options:0 error:&error];
NSLog(@"JSON:%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);

выходы:

{"value":1}

С этим я прошел и попытался выяснить, как AFHTTPClient необходимо настроить для отправки bool как 1/0 вместо true/false и не удалось найти. Вот мой сетевой код.

AFHTTPClient* httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://<SERVER HERE>"]];
[httpClient setParameterEncoding:AFJSONParameterEncoding];
NSMutableURLRequest *jsonRequest = [httpClient requestWithMethod:@"POST" path:@"/" parameters:@{@"value": @YES}];

AFHTTPRequestOperation *jsonOperation = [AFJSONRequestOperation JSONRequestOperationWithRequest:jsonRequest success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@"Success");
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    NSLog(@"Failure");
}];
[jsonOperation start];

Ответ 2

Так как @YES является NSNumber, NSJSONSerialization превращает это в 0/1.

Я не думаю, что существует способ, отличный от @{@"value": (yesOrNo ? @"true" : @"false")}, или использование другого класса сериализации.

Ответ 3

Для людей, которые могут столкнуться с этой проблемой, есть еще одна причина, почему это может происходить.

Убедитесь, что значение свойства parameterEncoding вашего подкласса AFHTTPClient равно AFJSONParameterEncoding, в противном случае вы столкнетесь с тем, что значение инициализации NSNumber не будет правильно обнаружено, и будет видно, что 0 и 1 были выбраны вместо кодер.

См. этот для справки.

Надеюсь, что это поможет.

Ответ 4

В подклассе HTTPClient. Вместо:

self.responseSerializer = [AFJSONResponseSerializer serializer];

попробуйте:

$self.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

Ответ 5

У меня такая же ошибка, я отправляю @YES, но службы дают мне сбой, поэтому я создаю и строку json и создаю jsonObject следующим образом:

NSString* paramsString = @"{";
NSString* appending = [NSString stringWithFormat:@"\"%@\":%@,", KEY_CHECKED, (checked ? @"true" : @"false")];
paramsString = [paramsString stringByAppendingString: appending];
paramsString = [paramsString stringByAppendingString:@"}"];
id object = [NSJSONSerialization JSONObjectWithData:[paramsString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];

Используйте этот объект для отправки сообщения с помощью AFNetworking

[self postParameters:object];

для меня работает!