react helmet deploy compile app iphone ios json nsdate

iphone - helmet - NSInvalidArgumentException, razón: ''Tipo no válido en escritura JSON(__NSDate)''



react helmet sync (7)

Como se indicó, primero debe convertir su NSDate a una NSString. Sin embargo, no está claro de inmediato en qué formato debe representarse la fecha. La respuesta se puede encontrar here : "JSON en sí no especifica cómo deben representarse las fechas, pero sí lo hace Javascript" - ISO8601.

Aquí hay un método de conversión ISO8601 de una categoría auxiliar para NSDate, cortesía 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 obtiene una cadena ISO8601 en una carga útil JSON y desea convertirla en un NSDate, use este método de clase para 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)]; }

Obtengo esta excepción cuando intento codificar JSON con el objeto NSDate. Creo que NSDate no es compatible con la codificación JSON. Pero debo codificar la fecha. ¿Alguna solución?

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


Convierte NSDate a NSString e intenta codificar.

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


Debe convertir la fecha en una cadena antes de intentar codificarla. Hay suficientes ejemplos en todas partes, por lo que debería ser fácil de encontrar


Has probado ?

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

Como se describe aquí: SDK no admite objetos NSDate

Siga estos pasos:

1. Convertir la fecha en formato JSON:

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

2. Incrustar en alguna matriz y POST la matriz.


La forma más sencilla de almacenar y recuperar un objeto NSDate en JSON sería usar la propiedad timeIntervalSince1970 de NSDate.

El NSTimeInterval devuelto (doble) es bastante estándar y puede convertirse fácilmente a un objeto NSDate usando:

NSDate dateWithTimeIntervalSince1970:<#(NSTimeInterval)#>


Para nuestro caso, estamos usando Mantle para convertir un objeto a JSON y uno de nuestros objetos con propiedad NSDate no tiene su JSONTransformer

@property (nonatomic) NSDate *expiryDate;

dónde:

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