2012-12-24 11 views
12

Próbuję wysłać żądanie JSON za pomocą AFNetworking i mam problem z wartościami, które mają być przetłumaczone na formę json z {"value": true}. Zamiast Dostaję: {"value": 1}AFNetworking żądania JSON z boolean

Oto zasadzie jak tworzę wniosek:

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

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

Am I brakuje czegoś trywialnego tutaj? :)

+3

Ponieważ @YES jest NSNumber, NSJSONSerialization zamienia to na 0/1. Nie sądzę, że istnieje sposób inny niż @ {@ "value": (yesOrNo? @ "True": @ "false")} lub użycie innej klasy serializacji. –

+0

@TalBereznitskey Wygląda na to, że mój serwer implementacji oczekuje, że boolean będzie ładnie traktował ciąg znaków "true"/"false"! Jeśli wkleisz to jako odpowiedź, zaakceptuję to :) – abyx

Odpowiedz

13

Krótka odpowiedź: Upewnij się, że używasz najnowszej wersji AFNetworking. To wszystko, co widzę jako problem oparty na podanym przez ciebie kodzie.

Długa odpowiedź: Próbowałem odtworzenie problemu jesteś opisujący z najnowszymi wersjami AFNetworking i nie mogłem. Wkopałem się w AFNetworking, aby zobaczyć, jak przebiega kodowanie JSON. AFHTTPClient.m:442 używa NSJSONSerialization do kodowania żądań JSON. Wpadłem na następujący kod do testowania problem:

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

Wyjścia:

{"value":true} 

Więc @YES powinno wystarczyć. Pamiętaj, aby upewnić się, że nie użyje w swoim kodzie @(YES), ponieważ będzie wyprowadzać jako 1 zamiast true.

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

wyjścia:

{"value":1} 

Mając to przeszedłem, próbując dowiedzieć się, jak AFHTTPClient muszą być skonfigurowane do wysyłania bool jako 1/0 zamiast true/false i nie mógł znaleźć każdy. Oto mój kod sieciowy.

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]; 
+0

Masz rację, to naprawdę powinno działać. Okazuje się, że mój problem wynika z mojego modelu Core Data, który z jakiegoś powodu nie zachowuje "boolness" mojej boolowskiej własności :) Dzięki za pomoc! – abyx

+0

Mam również pytanie dotyczące tego problemu: http://stackoverflow.com/q/14029473/573 – abyx

+0

To był mój problem: "Jako uwaga, nie używaj @ (TAK) w kodzie jako będzie wyprowadzane jako 1 zamiast prawdziwego. " BARDZO FRUSTRUJĄCE. – livingtech

2

Ponieważ @YES jest NSNumber, NSJSONSerialization zamienia to na 0/1.

Nie sądzę, że istnieje sposób inny niż @{@"value": (yesOrNo ? @"true" : @"false")} lub użycie innej klasy serializacji.

+1

@YES to 'NSNumber', ale jest tworzony na podstawie wartości BOOL (jest to odpowiednik' [NSNumber numberWithBool: YES] '.Istancja' NSNumber' będzie "pamiętać" typ, z którego został utworzony, więc Wyrażenie "NSJSONSerialization" wypisze prawidłową wartość. Możesz sprawdzić wartość zwróconą przez wysłanie komunikatu objctype do instancji 'NSNumber', a zobaczysz, że' @ YES' jest inne niż '@ 1' (lub' @ (TAK) ", jeśli o to chodzi)." – carlosfigueira

+1

"Należy zauważyć, że obiekty liczbowe niekoniecznie zachowują typ, w którym zostały utworzone." Z dokumentacji: https://developer.apple.com/library/mac/#documentation/Cocoa /Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html –

1

Dla osób, które mogą mieć wpływ na ten problem, jest jeszcze jeden powód, dla którego może się to zdarzyć.

Upewnij się ustawić właściwość swojego AFHTTPClient podklasy parameterEncoding do AFJSONParameterEncoding, w przeciwnym razie będzie prowadzony w kwestii wartości inicjalizacji NSNumber nie jest poprawnie wykrywany i zobaczy 0s i 1s jest wysyłany zamiast przez koder.

Patrz także this w celach informacyjnych.

Mam nadzieję, że to pomoże.

+0

Przybity, dzięki :) –

0

W podklasie HTTPClient.Zamiast:

self.responseSerializer = [AFJSONResponseSerializer serializer]; 

spróbuj:

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

Mam ten sam błąd, ja wysyłam @YES ale usługi dają mi się nie uda, więc tworzę i łańcuch z JSON i utworzyć JSONObject tak:

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

Użyj tego obiektu za wysłanie posta AFNetworking

[self postParameters:object]; 

dla mnie działa!

Powiązane problemy