当我尝试对 NSDate 对象进行 JSON 编码时出现此异常。我相信 NSDate 与 JSON 编码不兼容。但我必须对日期进行编码。任何解决方案?
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__NSDate)'
首先将您的数据存储在 NSString 中。然后将您的字符串转换为 NSDate。
您可以参考:
将 NSDate 转换为 NSString 并尝试编码。
- (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;
}
如前所述,您必须首先将您的 NSDate 转换为 NSString。然而,目前还不清楚日期应该用哪种格式表示。答案可以在这里找到:“JSON 本身并没有指定日期应该如何表示,但 Javascript 可以”——ISO8601。
这是来自 NSDate 的帮助程序类别的 ISO8601 转换方法,由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;
}
如果您在 JSON 有效负载中返回 ISO8601 字符串并希望将其转换为 NSDate,请对 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)];
}
你有没有尝试过 ?
updateDate = [NSNumber numberWithFloat:[[NSDate date] timeIntervalSince1970]];
如此处所述:SDK 不支持 NSDate 对象
请按照以下步骤操作:
1. 将日期转换为 JSON 格式:
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init]autorelease];
[formatter setDateFormat:@"Z"];
NSString *updateDate = [NSString stringWithFormat:@"/Date(%.0f000%@)/", [[NSDate date] timeIntervalSince1970],[formatter stringFromDate:[NSDate date]]];
2.嵌入一些数组并发布数组。
在 JSON 中存储和检索 NSDate 对象的最简单方法是使用 NSDate 的timeIntervalSince1970属性。
返回的 NSTimeInterval (double) 非常标准,可以使用以下方法轻松转换回 NSDate 对象:
NSDate dateWithTimeIntervalSince1970:<#(NSTimeInterval)#>
在尝试对其进行编码之前,您必须将日期转换为字符串。到处都有足够的例子,所以应该很容易找到
对于我们的案例,我们使用Mantle将一个对象转换为 JSON,并且我们的一个具有 NSDate 属性的对象缺少它的 JSONTransformer
@property (nonatomic) NSDate *expiryDate;
在哪里:
+ (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;
}
我在我的身体参数编码器中做这样的事情
// handle dates
var _params = [String: Any]()
params.forEach { (key, value) in
if let date = value as? Date {
_params[key] = DateFormatter.iso8601Full.string(from: date)
} else {
_params[key] = value
}
}
return try? JSONSerialization.data(withJSONObject: _params)