Пустой массив сериализации iOS JSON, сериализованный как nil вместо []

Я пытаюсь отправить некоторый JSON на серверную часть Rails. При сериализации полезной нагрузки (NSDictionary) пустой массив кодируется как nil вместо [ ] (пустой массив).

Кодирует ли JSON пустой NSArray, поскольку [] не поддерживается в iOS?

Я попытался изменить «параметры» в dataWithJSONObject: безуспешно. Отправка по @"[]" как обычной старой NSString также не работает.

Вот код:

NSData* jsonData = [NSJSONSerialization dataWithJSONObject:payload options:NSJSONReadingMutableLeaves error:&error];

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
AFJSONRequestOperation *authRequest = [AFJSONRequestOperation JSONRequestOperationWithRequest:request  success:successBlock failure:failBlock];
[authRequest start];

Спасибо за помощь!


person HackaZach    schedule 09.08.2013    source источник
comment
Я видел обратное в других языках, где используется пустой массив, потому что язык не имеет эквивалента NSNull. Думаю, у меня никогда не было вызова для отправки пустого массива на iOS.   -  person Hot Licks    schedule 10.08.2013
comment
Вы всегда можете попробовать одну из дюжины или около того реализаций JSON для Objective-C.   -  person Hot Licks    schedule 10.08.2013
comment
Я предлагаю вам передать адрес объекта NSError * в аргумент error:, а затем проверить его по возвращении.   -  person    schedule 10.08.2013
comment
Строка [] определенно является действительным JSON.   -  person Hot Licks    schedule 10.08.2013
comment
Я не могу воспроизвести проблему. Словарь @{@"key": @[]} преобразуется в данные JSON {"key":[]}.   -  person Martin R    schedule 10.08.2013
comment
(Я пропустил, где вы сказали, что он возвращает nil - я думал, что он возвращает строку (без кавычек) null, которая, ну, представляет собой JSON-представление для null. nil всегда указывает на ошибку.)   -  person Hot Licks    schedule 10.08.2013
comment
@MartinR Я тоже, вроде работает нормально   -  person Alladinian    schedule 10.08.2013
comment
Кто-нибудь пробовал пустой NSArray в качестве самого внешнего объекта?   -  person Hot Licks    schedule 10.08.2013
comment
@HotLicks Да, тоже работает нормально   -  person Alladinian    schedule 10.08.2013
comment
Кстати, NSJSONReadingMutableLeaves — это возможность читать JSON, а не записывать JSON.   -  person Martin R    schedule 10.08.2013
comment
Возможно, вам следует показать ваш фактический payload и вывод [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding].   -  person Martin R    schedule 10.08.2013
comment
Вы упомянули, что payload — это NSDictionary, так почему же у вас есть пустой массив [] в качестве объекта верхнего уровня? Кроме того, отправка NSString, содержащая @"[]"… куда? В метод сериализации JSON?   -  person Tricertops    schedule 10.08.2013


Ответы (1)


Я подозреваю, что проблема связана с Rails, а не с iOS, существует проблема, связанная с дырой в безопасности в Rails с версии 3.2.11.

https://github.com/rails/rails/issues/8832

https://github.com/rails/strong_parameters/issues/82

Например :

Отправка пустого массива в вашем теле {"bookmarks":[]}

Сериализуется в Rails как: {"bookmarks"=>nil}

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

person vdaubry    schedule 14.08.2013