Какой реальный тип?NSString или NSNumber - PullRequest
1 голос
/ 04 марта 2012

У меня есть NSDictionary, который содержит данные, преобразованные из данных json, например {"message_id":21}. затем я использую NSNumber *message_id = [dictionary valueForKey:@"message_id"], чтобы получить данные.

но когда я использую это message_id,

Message *message = [NSEntityDescription ....
message.messageId = message_id;

Я получил ошибку времени выполнения, присвоение _NSCFString для NSNumber ,

поэтому я должен использовать NSNumberFormatter для преобразования.

NSString *messageId = [dictionary valueForKey:@"message_id"];
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterNoStyle];
message.messageId = [f numberFromString:messageId];

этот код работает.

но когда я отлаживал, я увидел message_id из

NSNumber *message_id = [dictionary valueForKey:@"message_id"]

имеет допустимое значение, 21.

Кто-нибудь может увидеть проблему здесь?

Ответы [ 3 ]

3 голосов
/ 04 марта 2012

Вы пытаетесь сохранить NSString в NSNumber.Если вы хотите использовать его как NSNumber, вы можете сделать:

NSNumber *message_id = [NSNumber numberWithInt:[[dictionary valueForKey:@"message_id"] intValue]];

Это должно решить вашу проблему.

1 голос
/ 11 февраля 2014

Какую библиотеку вы используете для конвертации?{"message_id": 21} означает, что NSNumber со значением 21 должен быть возвращен как NSNumber, {"message_id": "21"} должен вернуть его как NSString.

Использование числового форматера - это полное излишество.Используйте метод "integerValue", который прекрасно работает как с NSString *, так и с NSNumber * - вы получите целое число 21, независимо от того, является ли объект NSString или NSNumber.Код форматера, очевидно, столкнется с проблемами, если ваш объект равен NSNumber, а не NSString.

Итак: message.messageId = [[NSNumber numberWithInteger: [messageId integerValue]];

Возможно, я бы добавил категорию в NSDictionary

  • (NSNumber *) nsIntegerNumberForKey: (NSString *) ключ

, который обрабатывает ситуации, когда ключ отсутствует, или где значение является нулевым значением, либо словарем, либо массивом, поэтому вы можете использовать его везде, где вам нужноNSNumber с целочисленным значением из документа JSON и везде проверяется на наличие ошибок.

0 голосов
/ 16 июля 2014

Прочитайте здесь СОХРАНЕНИЕ JSON ДЛЯ ОСНОВНЫХ ДАННЫХ и Официальная страница JSON

Стандарт JSON довольно четко показывает, как отличить строки от чисел - в основномстроки заключаются в кавычки, а цифры - нет.Однако веб-службы JSON не всегда хорошо выполняют это требование.И даже если они есть, они не всегда согласованы от одной записи к другой.

Поэтому, если вы получили NSNumber, где NSString предпочтительнее, вы должны проверить и исправить себя

...