Запрос 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];
Я пропустил что-то тривиальное здесь?:)
Ответы
Ответ 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];
для меня работает!