2012-12-24 3 views
12

Sto tentando di inviare una richiesta JSON utilizzando AFNetworking e ho un problema con la conversione dei valori nella forma JSON di {"value": true}. Invece, sto ottenendo: {"value": 1}AFNetworking richiesta JSON con booleano

Ecco fondamentalmente come Sto creando la richiesta:

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

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

mi sto perdendo qualcosa banale qui? :)

+3

Poiché @YES è un NSNumber, NSJSONSerialization lo trasforma in 0/1. Non penso ci sia un modo diverso da @ {@ "valore": (yesOrNo? @ "True": @ "false")} o utilizzando una classe di serializzazione diversa. –

+0

@TalBereznitskey Sembra un'implementazione del mio server che si aspetta che un booleano gestisca bene un valore stringa di "true"/"false"! Se dovessi incollarlo come risposta, lo accetterò :) – abyx

risposta

13

Risposta breve: Assicurarsi di eseguire una versione recente di AFNetworking. Questo è tutto ciò che posso vedere come problema basato sul codice che hai fornito.

Risposta lunga: Ho provato riprodurre il problema che stai descrivendo con le più recenti versioni di AFNetworking e non ho potuto. Ho scavato in AFNetworking per vedere come è fatta la codifica di JSON. AFHTTPClient.m:442 utilizza NSJSONSerialization per codificare le richieste JSON. Sono venuto con il seguente codice per verificare il problema:

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

uscite:

{"value":true} 

Così @YES dovrebbe farlo. Come nota, assicurati che lo non sia per utilizzare @(YES) nel tuo codice poiché verrà emesso come 1 anziché true.

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

uscite:

{"value":1} 

Con che ho passato e ho cercato di capire come AFHTTPClient bisogno di essere configurato per inviare una bool come 1/0 invece di true/false e non riuscivano a trovare qualunque. Ecco il mio codice di rete.

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

Hai ragione, questo dovrebbe funzionare. Risulta che il mio problema è il risultato del mio modello Core Data che per qualche motivo non mantiene la "boolness" della mia proprietà booleana :) Grazie per l'aiuto! – abyx

+0

Inoltre, ho creato una domanda su questo problema: http://stackoverflow.com/q/14029473/573 – abyx

+0

Questo era il mio problema: "Come nota, assicurati di non usare @ (YES) nel tuo codice come uscirà come 1 invece che come vero. " COSÌ FRUSTRANTE. – livingtech

2

Poiché @YES è un NSNumber, NSJSONSerialization lo trasforma in 0/1.

Non penso ci sia un modo diverso da @{@"value": (yesOrNo ? @"true" : @"false")} o utilizzando una classe di serializzazione diversa.

+1

@YES è un 'NSNumber', ma è creato in base a un valore BOOL (è equivalente a' [NSNumber numberWithBool: YES] '. E l'istanza' NSNumber' "ricorderà" il tipo con cui è stata creata, quindi il 'NSJSONSerialization' produrrà la cosa giusta.Puoi controllare il valore restituito inviando il messaggio' objCType' all'istanza 'NSNumber', e vedrai che' @ YES' è diverso da '@ 1' (o' @ (SÌ) ", per quella materia). – carlosfigueira

+1

" Nota che gli oggetti numero non conservano necessariamente il tipo con cui sono creati. "Dalla documentazione: https://developer.apple.com/library/mac/#documentation/Cocoa /Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html –

1

Per le persone che potrebbero essere in esecuzione in questo problema, c'è un altro motivo per cui potrebbe accadere.

assicurarsi di impostare la proprietà parameterEncoding del AFHTTPClient sottoclasse di AFJSONParameterEncoding, altrimenti si incorrerà nella questione del valore di inizializzazione del NSNumber non essere rilevato correttamente, e vedrà 0 e 1 viene emesso invece dal codificatore.

Vedere this come riferimento.

Spero che questo aiuti.

+0

Inchiodato, grazie :) –

0

Nella sottoclasse di HTTPClient.Invece di:

self.responseSerializer = [AFJSONResponseSerializer serializer]; 

provare con:

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

ho lo stesso errore, io mando i @YES ma i servizi mi danno fallire, così creo e stringa di un JSON e creare un JsonObject come questo:

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

Utilizzare questo oggetto per inviare il post con AFNetworking

[self postParameters:object]; 

per me funziona!