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;
}
Primero almacena tus datos en NSString. Y luego convierte tu cadena a NSDate.
Puede referirse a SO:
Convertir NSString a NSDate (y viceversa)