AFNetworking publica los arreglos JSON como múltiples dictionarys de una sola input

Estoy teniendo un problema similar al que se discute aquí .

Estoy intentando publicar JSON en un server.

Aquí está el código Objective-C que debería funcionar, pero no funciona. Obtengo una matriz vacía en el object de respuesta, no estoy seguro de por qué:

AFHTTPRequestOperation * operation = [manager POST:uploadScriptUrl parameters:mutableJSON success:^(AFHTTPRequestOperation * operation, id responseObject) { successBlock(operation, responseObject); } failure:^(AFHTTPRequestOperation * operation, NSError * error) { failureBlock(operation, error); }]; 

Este código (que está adaptado del código que uso para upload imágenes) TIPO DE funciona. Sé que definitivamente no es la forma aprobada de hacerlo:

  AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager]; AFJSONRequestSerializer * requestSerializer = [AFJSONRequestSerializer serializer]; [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; manager.requestSerializer = requestSerializer; AFHTTPRequestOperation * operation = [manager POST:uploadScriptUrl parameters:mutableJSON //passed in constructingBodyWithBlock:^(id <AFMultipartFormData> formData) { //Do nothing } success:^(AFHTTPRequestOperation * operation, id responseObject) { successBlock(operation, responseObject); } failure:^(AFHTTPRequestOperation * operation, NSError * error) { failureBlock(operation, error); }]; 

Publica mi JSON en el server, pero en el process de formular la request, el JSON está destrozado.

Así es como comienza:

 { "key1": [ { "dictionary1": { "param1": "value1", "param2": "value2", "array1A": [ "value1", "value2" ], "array1B": [ "value1", "value2" ] } } ] 

}

y aquí está lo que AFNetworking envía al server:

 { "key1": [ { "dictionary1": { "array1A": [ "value1" ] } }, { "dictionary1": { "array1A": [ "value2" ] } }, { "dictionary1": { "array1B": [ "value1" ] } }, { "dictionary1": { "array1B": [ "value2" ] } }, { "dictionary1": { "param1": "value1" } }, { "dictionary1": { "param2": "value2" } } ] 

}

Esto es lo que Charles muestra para la request. Puede ver cómo la estructura JSON ya se ha alterado en la request, antes de que el server haya tocado los datos.

Aquí está el PHP que estoy usando en el server. Dead simple por ahora:

 <?php header('Content-type: application/json'); //Not sure if this is needed. $json_string = json_encode($_POST); header("HTTP/1.0 200 OK"); echo $json_string; ?> 

Entonces, todo esto dicho, aquí están mis preguntas:

  1. ¿Controla AFNetworking las matrices JSON anidadas? En esta página, Mattt dice: "La estructura que está describiendo no se puede representar de manera determinista con la encoding de cadena de consulta". Estoy usando POST, por lo que las cadenas de consulta no están involucradas. Pero tal vez la limitación existe también con los datos POST?

  2. También tengo curiosidad por qué la llamada AFNetworking más larga que incluye la constructingBodyWithBlock BodyWithBlock tiene éxito mientras que la más corta falla. Sin embargo, esta respuesta es less importante para mí. El método más largo casi funciona y me gustaría utilizarlo si devolviera el mismo JSON que envío.

¡Gracias a todos!

Estoy usando POST, por lo que las cadenas de consulta no están involucradas. Pero tal vez la limitación existe también con los datos POST?

La limitación no está en POST, es la encoding del formulario URL. Voy a decir que debe codificar como JSON, lo que puede hacer con el siguiente cambio de configuration a su administrador:

manager.requestSerializer = [AFJSONRequestSerializer serializer]; .

Además, a less que esté realmente construyendo una request de varias partes, no use la versión constructingBodyWithBlock de ese método.

Acabo de tratar con el mismo problema y la única solución que pude encontrar fue crear un dictionary fuera de la matriz. Debe haber una manera mejor, esto es bastante feo …

  NSMutableDictionary *arrayDict = [[NSMutableDictionary alloc] init]; int counter = 0; for (NSMutableDictionary *arrayItem in arrayToSend) { [arrayDict setObject:arrayItem forKey:[NSNumber numberWithInt:counter]]; counter++; } 

De lo contrario todo se aplanó. Utilizo AFJSONRequestSerializer, pero eso no parece importar.

Las soluciones fieras son para los débiles: ¿Cómo puedo POSTAR un NSArray de NSDictionaries dentro de un NSDictionary sin problemas?

La respuesta a esta publicación contiene todo lo que necesita.

Yo también tuve este problema recientemente, tenía los siguientes parameters para enviar al server, pero la matriz de "características" se dividía en 4 partes en lugar de solo 2 dictionarys.

  { "description": "Temporary Description", "name": "Product Name", "feature": [ { "fkey": "FT1", "fvalue": "FD1" }, { "fkey": "FT2", "fvalue": "FD2" } ] } 

Entonces cambié el

AFURLRequestSerialisation.m

reemplazó esta línea en el AFQueryStringPairsFromKeyAndValue(NSString *key, id value)

 [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; 

con

 [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[%i]", key, [array indexOfObject:nestedValue]], nestedValue)]; 

Y esto hizo el truco. Espero que esto pueda ayudar a alguien.