NSInvalidArgumentException, reason: 'Invalid type in JSON write (__NSDate)'

时光怂恿深爱的人放手 提交于 2019-12-02 22:15:21
Rushi

FIrst store your data in NSString. And then convert your string to NSDate.

You can refer SO:

Converting NSString to NSDate (and back again)

NSString to NSDate conversion problem

How to convert NSString to NSDate using NSDateFormatter?

pradeepa

Convert NSDate to NSString and try to encode.

- (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;
}
sumizome

As noted, you must first convert your NSDate to an NSString. It's not immediately clear, however, which format the date should be represented in. The answer can be found here: "JSON itself does not specify how dates should be represented, but Javascript does" -- ISO8601.

Here is an ISO8601 conversion method from a helper category for NSDate, courtesy Erica Sadun:

- (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;
}

If you get an ISO8601 string back in a JSON payload and want to convert it to an NSDate, use this class method for 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)];
}
Bhavin

Have you tried ?

updateDate = [NSNumber numberWithFloat:[[NSDate date] timeIntervalSince1970]];

As Described Here : SDK not supporting NSDate objects

Follow these Steps :

1. Convert the Date in JSON Format :

 NSDateFormatter *formatter = [[[NSDateFormatter alloc] init]autorelease];
 [formatter setDateFormat:@"Z"];
 NSString *updateDate = [NSString stringWithFormat:@"/Date(%.0f000%@)/", [[NSDate date] timeIntervalSince1970],[formatter stringFromDate:[NSDate date]]];

2. Embed In some array and POST the array.

The simplest way to store and retrieve a NSDate object in JSON would be to use the timeIntervalSince1970 property of NSDate.

The returned NSTimeInterval (double) is pretty standard and can easily be converted back to a NSDate object using:

NSDate dateWithTimeIntervalSince1970:<#(NSTimeInterval)#>

You must convert the date to a string before you try to encode it. There are enough examples everywhere so it should be easy to find

For our case, we are using Mantle to convert an object to JSON and one of our objects with property NSDate is missing its JSONTransformer

@property (nonatomic) NSDate *expiryDate;

where:

+ (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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!