web-dev-qa-db-fra.com

NSInvalidArgumentException, raison: 'Type non valide en écriture JSON (__NSDate)'

Je reçois cette exception lorsque j'essaie de coder JSON avec l'objet NSDate. Je crois que NSDate n'est pas compatible avec le codage JSON. mais je dois encoder la date. Des solutions?

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__NSDate)'
19
Harikrishnan

Commencez par stocker vos données dans NSString. Puis convertissez votre chaîne en NSDate.

Vous pouvez vous référer SO:

Conversion de NSString en NSDate (et vice versa)

Problème de conversion de NSString à NSDate

Comment convertir NSString en NSDate en utilisant NSDateFormatter?

12
Rushi

Convertissez NSDate en NSString et essayez d’encoder.

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

As-tu essayé ? 

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

Comme décrit ici: SDK ne prenant pas en charge les objets NSDate

Suivez ces étapes:

1. Convertissez la date au format JSON:

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

2. Incorporer dans un tableau et POST le tableau.

4
Bhavin

Comme indiqué, vous devez d’abord convertir votre NSDate en NSString. Cependant, le format dans lequel la date doit être représentée n’est pas encore clair. La réponse peut être trouvée ici : "JSON lui-même ne spécifie pas comment les dates doivent être représentées, mais Javascript le fait" - ISO8601.

Voici une méthode de conversion ISO8601 d’une catégorie d’aide pour NSDate, avec la permission de 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;
}

Si vous obtenez une chaîne ISO8601 dans une charge JSON et souhaitez la convertir en NSDate, utilisez cette méthode de classe pour 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)];
}
4
sumizome

Le moyen le plus simple de stocker et d'extraire un objet NSDate en JSON serait d'utiliser la propriététimeIntervalSince1970 de NSDate.

Le NSTimeInterval (double) renvoyé est assez standard et peut facilement être reconverti en objet NSDate à l'aide de:

NSDate dateWithTimeIntervalSince1970:<#(NSTimeInterval)#>
2
Julius

Pour notre cas, nous utilisons Mantle pour convertir un objet en JSON et un de nos objets avec la propriété NSDate manque de JSONTransformer.

@property (nonatomic) NSDate *expiryDate;

où:

+ (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;
}
0
Ted

Vous devez convertir la date en chaîne avant d'essayer de l'encoder. Il y a suffisamment d'exemples partout, il devrait donc être facile de trouver

0
Ismael