Подтвердить что ты не робот

Как заставить NSJSONSerialization выводить логическое значение как true или false?

Я использую данные NSJSONSerializationWithJSONObject для сериализации моих классов в JSON. Когда он сериализует BOOL, он дает значение 1 или 0 в строке JSON. Мне нужно, чтобы это было правдой или ложью. Возможно ли это сделать в целом?

4b9b3361

Ответ 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