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

前端 未结 8 2161
南旧
南旧 2021-02-04 01:05

I\'m getting this exception when I try to JSON encode NSDate object.I believe NSDate is not compatible for JSON encoding. but I must encode the date.Any solutions?



        
相关标签:
8条回答
  • 2021-02-04 01:15

    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

    0 讨论(0)
  • 2021-02-04 01:16

    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.

    0 讨论(0)
  • 2021-02-04 01:17

    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)];
    }
    
    0 讨论(0)
  • 2021-02-04 01:21

    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)#>
    
    0 讨论(0)
  • 2021-02-04 01:25

    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;
    }
    
    0 讨论(0)
  • 2021-02-04 01:29

    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?

    0 讨论(0)
提交回复
热议问题