Я использую данные NSJSONSerializationWithJSONObject для сериализации моих классов в JSON. Когда он сериализует BOOL, он дает значение 1 или 0 в строке JSON. Мне нужно, чтобы это было правдой или ложью. Возможно ли это сделать в целом?
Как заставить NSJSONSerialization выводить логическое значение как true или false?
Ответ 1
Нет, объект Foundation для Bool - NSNumber
numberWithBool
, который становится либо 0, либо 1. У нас нет объекта Bool
. То же самое для чтения JSON
. True/false снова станет NSNumber
.
Вы можете создать класс Bool
и создать собственный парсер. Массивы - это массивы, а JSON
Объекты - NSDictionary
. Вы можете запросить ключи, проверить класс, лежащий за ним, и построить из него JSON
String.
Ответ 2
Когда я создаю [NSNumber numberWithBool:NO]
, NSJSONSerialization возвращает слово "false" в строке JSON.
EDIT С помощью новых ярлыков вы также можете использовать этих удобных парней:
@(YES) / @(NO)
@(1) / @(0)
@YES / @NO
@1 / @0
Таким образом, вы можете избежать чего-то вроде циклизации ваших значений. Я хочу абсолютно противоположное поведение, но имеет объекты NSNumber
. Поэтому мне нужно петли...
EDIT II
mbi указал в комментариях, что существует разница между версиями iOS. Итак, вот тест iOS9:
NSDictionary *data = @{
@"a": @(YES),
@"b": @YES,
@"c": @(1),
@"d": @1
};
NSLog(@"%@", [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding]);
2016-07-05 02:23:43.964 Test App[24581:6231996] {"a":true,"b":true,"c":1,"d":1}
Ответ 3
Просто наткнулся на это сам, не уверен, что это лучший ответ, но...
Обязательно используйте @YES или @NO, тогда ваш вывод json будет иметь в нем true/false:
[NSJSONSerialization dataWithJSONObject:@{@"test": @YES} options:0 error: nil];
Таким образом, при вставке в словарь для dataWithJSONObject вам придется повернуть ваши другие "логические" /boolean значения → @YES/@NO.
[NSJSONSerialization dataWithJSONObject:@{@"test": (boolLikeValue ? @YES : @NO)} options:0 error: nil];
Ответ 4
Да, вы можете выводить логическое значение (true/false) с помощью NSJSONSerialization с помощью kCFBooleanTrue и kCFBooleanFalse:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:kCFBooleanTrue, @"key_1",
kCFBooleanFalse, @"key_2",
nil]
затем
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error];
Ответ 5
Я просто попал в проблему на iOS9.
Мое дело в том, что у меня есть свойство CoreData workout.private
, которое bool отображается NSNumber * из-за обработки CoreData.
При создании JSON
[NSNumber numberWithBool:workout.private.boolValue]
устанавливает ожидаемое значение true/false в JSON, но только workout.private
или @(workout.private.boolValue) устанавливает "1" или "0".
Ответ 6
Я столкнулся с аналогичной проблемой при использовании CoreData boolean, который также хранится как NSNumber. Самое простое решение для меня: @():
[NSJSONSerialization dataWithJSONObject:@{@"bool": @([object.value boolValue])} options:0 error: nil];
Я думаю, @() распознает значение BOOL и инициализирует NSNumber с помощью numberWithBool: что приводит к истинному/ложному в JSON