AFNetworking размещает массивы JSON в виде нескольких одноразовых словарей

У меня есть аналогичная проблема с обсуждаемой здесь .

Я пытаюсь отправить JSON на сервер.

Вот код Objective-C, который должен работать, но нет. Я получаю пустой массив в объекте ответа, не уверен, почему:

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

Этот код (который адаптирован из кода, который я использую для загрузки изображений). Я знаю, что это определенно не одобренный способ сделать это:

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

Он отправляет мой JSON на сервер, но в процессе формулировки запроса JSON искажается.

Вот как это начинается:

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

}

и вот что передает AFNetworking на сервер:

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

}

Вот что показывает Чарльз для запроса. Вы можете увидеть, как структура JSON уже была изменена в запросе, прежде чем сервер коснулся данных.

Вот PHP, который я использую на сервере. Мертвый просто:

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

Итак, все сказанное, вот мои вопросы:

  1. Поддерживает ли AFNetworking вложенные массивы JSON? На этой странице Mattt говорит: «Структура, которую вы описываете, не может быть детерминистически представлена ​​с кодировкой строки запроса». Я использую POST, поэтому строки запроса не задействованы. Но возможно ли ограничение существует и с данными POST?

  2. Мне также любопытно, почему более длинный вызов AFNetworking, который включает в себя constructingBodyWithBlock преуспевает, а более короткий – не выполняется. Однако этот ответ менее важен для меня. Более длинный метод почти работает, и я был бы рад использовать его, если он вернет тот же JSON, который я отправляю.

Спасибо всем!

Я использую POST, поэтому строки запроса не задействованы. Но возможно ли ограничение существует и с данными POST?

Ограничение не на POST, это кодировка URL-адреса. Я продолжаю говорить, что вы должны кодировать как JSON, что вы можете сделать со следующим изменением конфигурации для своего менеджера:

manager.requestSerializer = [AFJSONRequestSerializer serializer]; ,

Кроме того, если вы фактически не создаете многокомпонентный запрос, не используйте constructingBodyWithBlock версии этого метода.

Я только что рассмотрел ту же проблему, и единственным решением, которое я смог найти, было создание словаря из массива. Должен быть лучший способ, это довольно уродливо …

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

В противном случае все получилось сплющено. Я использую AFJSONRequestSerializer, но это, похоже, не имеет значения.

Уродливые решения для слабых людей: как я могу без проблем запускать NSArray из NSDictionaries внутри NSDictionary?

Ответ на этот пост содержит все, что вам нужно.

У меня тоже была эта проблема в последнее время, у меня были следующие параметры для отправки на сервер, но массив «feature» разбился на 4 части, а не только на два словаря.

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

Поэтому я изменил

AFURLRequestSerialisation.m

заменила эту строку в AFQueryStringPairsFromKeyAndValue(NSString *key, id value)

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

с

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

И это трюк. Надеюсь, это может помочь кому-то.