NSInvalidArgumentException, причина: "Недопустимый тип в записи JSON (__NSDate)"
Я получаю это исключение, когда пытаюсь JSON кодировать объект NSDate. Я считаю, NSDate несовместим для кодирования JSON. но я должен кодировать дату. Все решения?
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__NSDate)'
Ответы
Ответ 1
FIrst сохраняет ваши данные в NSString. А затем преобразуйте свою строку в NSDate.
Вы можете ссылаться на SO:
Преобразование NSString в NSDate (и обратно)
NSString для проблемы преобразования NSDate
Как преобразовать NSString в NSDate с помощью NSDateFormatter?
Ответ 2
Преобразование NSDate в NSString и попытка кодирования.
- (NSString *) changeDateToDateString :(NSDate *) date {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
NSLocale *locale = [NSLocale currentLocale];
NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"hh mm" options:0 locale:locale];
[dateFormatter setDateFormat:dateFormat];
[dateFormatter setLocale:locale];
NSString *dateString = [dateFormatter stringFromDate:date];
return dateString;
}
Ответ 3
Вы пробовали?
updateDate = [NSNumber numberWithFloat:[[NSDate date] timeIntervalSince1970]];
Как описано здесь: SDK не поддерживает объекты NSDate
Следуйте этим Шагам:
1. Преобразование даты в формате JSON:
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init]autorelease];
[formatter setDateFormat:@"Z"];
NSString *updateDate = [NSString stringWithFormat:@"/Date(%.0f000%@)/", [[NSDate date] timeIntervalSince1970],[formatter stringFromDate:[NSDate date]]];
2. Вставить в некоторый массив и POST массив.
Ответ 4
Как уже отмечалось, вы должны сначала преобразовать NSDate в NSString. Однако не сразу понятно, в каком формате должна быть представлена дата. Ответ можно найти здесь: "Сам JSON не указывает, как даты должен быть представлен, но Javascript делает" - ISO8601.
Вот метод преобразования ISO8601 из вспомогательной категории для NSDate, любезно Эрика Садун:
- (NSString *)ISO8601 {
struct tm time;
time_t interval = [self timeIntervalSince1970];
gmtime_r(&interval, &time);
char *x = calloc(1, 21);
strftime_l(x, 20, "%FT%TZ", &time, gmtlocale);
NSString *string = [NSString stringWithUTF8String:x];
free(x);
return string;
}
Если вы получите строку ISO8601 в полезной нагрузке JSON и хотите преобразовать ее в NSDate, используйте этот метод класса для NSDate:
+ (NSDate *)dateFromISO8601:(NSString *)string {
if(!string) return nil;
if (![string isKindOfClass:[NSString class]]) return nil;
struct tm time;
strptime_l([string UTF8String], "%FT%TZ", &time, gmtlocale);
return [NSDate dateWithTimeIntervalSince1970:timegm(&time)];
}
Ответ 5
Простейшим способом хранения и извлечения объекта NSDate в JSON будет использование свойства timeIntervalSince1970 NSDate.
Возвращенный NSTimeInterval (double) довольно стандартный и может быть легко преобразован обратно в объект NSDate, используя:
NSDate dateWithTimeIntervalSince1970:<#(NSTimeInterval)#>
Ответ 6
Вы должны преобразовать дату в строку, прежде чем пытаться ее кодировать. Достаточно примеров повсюду, поэтому легко найти
Ответ 7
В нашем случае мы используем Mantle для преобразования объекта в JSON, а один из наших объектов с свойством NSDate отсутствует его JSONTransformer
@property (nonatomic) NSDate *expiryDate;
где:
+ (NSValueTransformer *)expiryDateJSONTransformer {
return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) {
return [self.dateFormatter dateFromString:dateString];
} reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) {
return [self.dateFormatter stringFromDate:date];
}];
}
+ (NSDateFormatter *)dateFormatter {
NSDateFormatter *df = [NSDateFormatter new];
df.dateFormat = @"yyyy-MM-dd";
return df;
}