AFNetworking POST метод с вложенным NSDictionary
Я использую AF-networking 2. Я хочу отправить вложенный NSMutableDictionary
на сервер. Это метод, который я использую.
NSMutableArray *arrayRecordSet =[NSMutableArray array];
for (id contact in _contactGroupArr) {
ContactGroup *contactGroup=contact;
NSMutableDictionary *dictGroupDetails=[NSMutableDictionary dictionary];
[dictGroupDetails setObject:contactGroup.guid forKey:@"guid"];
[dictGroupDetails setObject:contactGroup.name forKey:@"name"];
[dictGroupDetails setObject:@"" forKey:@"description"];
[dictGroupDetails setObject:contactGroup.status forKey:@"isDeleted"];
NSMutableDictionary *dictContactGroup=[[NSMutableDictionary alloc]init];
[dictContactGroup setObject:dictGroupDetails forKey:@"contact_group"];
[arrayRecordSet addObject:dictContactGroup];
}
NSMutableDictionary *dictSyncData=[[NSMutableDictionary alloc]init];
[dictSyncData setObject:arrayRecordSet forKey:@"recordset"];
[dictSyncData setValue:@"2014-06-30 04:47:45" forKey:@"last_sync_date"];
NSString *getPath = [NSString stringWithFormat:API_SYNC_CONATCTGROUP];
[self POST:getPath parameters:dictSyncData
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"%@",responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@",error);
}];
Но сервер ожидает формат Json
Array
(
[last_sync_date] => 2014-06-30 04:47:45
[recordset] => Array
(
[0] => Array
(
[contact_group] => Array
(
[guid] => y37845y8y
[name] => Family
[description] => Family members
[isDeleted] => 0
)
)
[1] => Array
(
[contact_group] => Array
(
[guid] => gt45tergh4
[name] => Office
[description] => Office members
[isDeleted] => 0
)
)
)
)
Но мой код посылает этот неправильный формат
Array
(
[last_sync_date] => 2014-06-30 04:47:45
[recordset] => Array
(
[0] => Array
(
[contact_group] => Array
(
[description] =>
)
)
[1] => Array
(
[contact_group] => Array
(
[guid] => 8D9763F6-38EF-49C7-860D-62759D77A779
)
)
[2] => Array
(
[contact_group] => Array
(
[isDeleted] => 1
)
)
[3] => Array
(
[contact_group] => Array
(
[name] => dfhdfhfd
)
)
[4] => Array
(
[contact_group] => Array
(
[description] =>
)
)
[5] => Array
(
[contact_group] => Array
(
[guid] => B9AC3F61-6F35-4447-87CE-6399E863C84A
)
)
[6] => Array
(
[contact_group] => Array
(
[isDeleted] => 1
)
)
[7] => Array
(
[contact_group] => Array
(
[name] => eretert
)
)
[8] => Array
(
[contact_group] => Array
(
[description] =>
)
)
[9] => Array
(
[contact_group] => Array
(
[guid] => 8D651A62-ABDE-4062-96EF-0922768008FA
)
)
[10] => Array
(
[contact_group] => Array
(
[isDeleted] => 1
)
)
[11] => Array
(
[contact_group] => Array
(
[name] => gghfgh
)
)
)
)
Но я проверил свой NSMutableDictionary
. Это правильно. Потому что вручную я создаю строку NSJson
. Это даст правильный формат. Я вещь afnetworking создать неправильный формат json.
Я даю мое полное усилия. Но все же у меня есть проблема
EDIT
Сервер ожидает json
{
"last_sync_date": "2014-06-30 04:47:45",
"recordset": [
{
"contact_group": {
"guid": "y37845y8y",
"name": "Family",
"description": "Family members",
"isDeleted": 0
}
},
{
"contact_group": {
"guid": "gt45tergh4",
"name": "Office",
"description": "Office members",
"isDeleted": 0
}
}
]
}
2 ответа:
Похоже, что вы должны исказить словарь
contact_group
в другом словаре. Попробуй что-нибудь вроде этого.Здесь то, что я сделал на уровне 3, было обернутоint index = 0; for (id contact in _contactGroupArr) { ContactGroup *contactGroup=contact; //level 1 NSMutableDictionary *dictGroupDetails=[NSMutableDictionary dictionary]; [dictGroupDetails setObject:contactGroup.guid forKey:@"guid"]; [dictGroupDetails setObject:contactGroup.name forKey:@"name"]; [dictGroupDetails setObject:@"" forKey:@"description"]; [dictGroupDetails setObject:contactGroup.status forKey:@"isDeleted"]; //level 2 NSMutableDictionary *dictContactGroup=[[NSMutableDictionary alloc]init]; [dictContactGroup setObject:dictGroupDetails forKey:@"contact_group"]; //level 3 NSMutableDictionary *dictArry=[[NSMutableDictionary alloc]init]; [dictArry setObject:dictContactGroup forKey:[NSString stringWithFormat:@"%d",index]]; [arrayRecordSet addObject:dictArry]; index ++; }
dictContactGroup
NSMutableDictionary в другой NSMutableDictionary под названиемdictArry
, чтобы сделать структуру объекта JSON такой же.[0] => Array ( [contact_group] => Array ( [guid] => y37845y8y [name] => Family [description] => Family members [isDeleted] => 0 ) )
Похоже, что вы пропускаете дополнительный слой в части:
NSMutableDictionary *dictContactGroup=[[NSMutableDictionary alloc]init]; [dictContactGroup setObject:dictGroupDetails forKey:@"contact_group"];
Я думаю, вам нужно завернуть ваши:
dictGroupDetails
В другой массив затем установите этот массив в качестве объекта dictContactGroup, так что что-то вроде этого:
NSMutableDictionary *dictContactGroup=[[NSMutableDictionary alloc]init]; NSArray *wrapperArray = @[dictGroupDetails]; [dictContactGroup setObject:wrapperArray forKey:@"contact_group"];
Вы можете видеть, что я имею в виду?
Дополнительное редактирование 1
Забыл также упомянуть, что из вашего предполагаемого ожидаемого вывода также следует, что каждый элемент в arrRecordSet содержит массив контактной группы.
Вам, вероятно, также потребуется обернуть сама ваша диктконтактная группа внутри внешнего wrapperArray:
NSMutableDictionary *dictContactGroup=[[NSMutableDictionary alloc]init]; NSArray *wrapperArray = @[dictGroupDetails]; [dictContactGroup setObject:wrapperArray forKey:@"contact_group"]; // notice the extra @[ ] wrapped around "dictContactGroup" [arrayRecordSet addObject:@[dictContactGroup]];
Дополнительное редактирование 2
Я не уверен, что вышеупомянутый "ожидаемый результат", который вы предоставили выше, точен, вы, кажется, вручную набрали его.
Я написал быстрое демонстрационное приложение, чтобы проверить логику выше:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSMutableArray *arrRecordSet = [[NSMutableArray alloc] init]; NSArray *arrContactGroups = @[@0, @1, @2, @3, @4, @5]; for(int i = 0; i < arrContactGroups.count; i++) { NSMutableDictionary *dictGroupDetails=[NSMutableDictionary dictionary]; [dictGroupDetails setObject:@"1234" forKey:@"guid"]; [dictGroupDetails setObject:@"group name" forKey:@"name"]; [dictGroupDetails setObject:@"group description" forKey:@"description"]; [dictGroupDetails setObject:@"not deleted" forKey:@"isDeleted"]; NSMutableDictionary *dictContactGroup=[[NSMutableDictionary alloc]init]; [dictContactGroup setObject:@[dictGroupDetails] forKey:@"contact_group"]; [arrRecordSet addObject:@[dictContactGroup]]; } NSMutableDictionary *dictSyncData=[[NSMutableDictionary alloc]init]; [dictSyncData setObject:arrRecordSet forKey:@"recordset"]; [dictSyncData setValue:@"2014-06-30 04:47:45" forKey:@"last_sync_date"]; NSLog(@"dictSyncData = \n\n%@", dictSyncData); }
Вывод, который я получил:
{ "last_sync_date" = "2014-06-30 04:47:45"; recordset = ( ( { "contact_group" = ( { description = "group description"; guid = 1234; isDeleted = "not deleted"; name = "group name"; } ); } ), ( { "contact_group" = ( { description = "group description"; guid = 1234; isDeleted = "not deleted"; name = "group name"; } ); } ), ( { "contact_group" = ( { description = "group description"; guid = 1234; isDeleted = "not deleted"; name = "group name"; } ); } ), ( { "contact_group" = ( { description = "group description"; guid = 1234; isDeleted = "not deleted"; name = "group name"; } ); } ), ( { "contact_group" = ( { description = "group description"; guid = 1234; isDeleted = "not deleted"; name = "group name"; } ); } ), ( { "contact_group" = ( { description = "group description"; guid = 1234; isDeleted = "not deleted"; name = "group name"; } ); } ) ); }
Что соответствует ожидаемому результату, поэтому я думаю, что здесь что-то потеряно в переводе.
Можете ли вы предоставить нам фактические результаты консольный вывод из вашего приложения, а не вручную набранная версия, которую вы сделали?