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 4

2 ответа:

Похоже, что вы должны исказить словарь contact_group в другом словаре. Попробуй что-нибудь вроде этого.

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

    }
Здесь то, что я сделал на уровне 3, было обернуто 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";
                    }
                );
            }
        )
    );
}

Что соответствует ожидаемому результату, поэтому я думаю, что здесь что-то потеряно в переводе.

Можете ли вы предоставить нам фактические результаты консольный вывод из вашего приложения, а не вручную набранная версия, которую вы сделали?