25

当我尝试对 NSDate 对象进行 JSON 编码时出现此异常。我相信 NSDate 与 JSON 编码不兼容。但我必须对日期进行编码。任何解决方案?

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

8 回答 8

14

首先将您的数据存储在 NSString 中。然后将您的字符串转换为 NSDate。

您可以参考:

将 NSString 转换为 NSDate(然后再返回)

NSString 到 NSDate 的转换问题

如何使用 NSDateFormatter 将 NSString 转换为 NSDate?

于 2013-01-15T12:13:03.000 回答
7

将 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;
}
于 2013-01-15T12:13:22.020 回答
5

如前所述,您必须首先将您的 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)];
}
于 2014-08-04T23:18:32.303 回答
4

你有没有尝试过 ?

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.嵌入一些数组并发布数组。

于 2013-01-15T12:16:28.457 回答
2

在 JSON 中存储和检索 NSDate 对象的最简单方法是使用 NSDate 的timeIntervalSince1970属性。

返回的 NSTimeInterval (double) 非常标准,可以使用以下方法轻松转换回 NSDate 对象:

NSDate dateWithTimeIntervalSince1970:<#(NSTimeInterval)#>
于 2017-08-02T21:25:13.030 回答
1

在尝试对其进行编码之前,您必须将日期转换为字符串。到处都有足够的例子,所以应该很容易找到

于 2013-01-15T12:13:48.833 回答
0

对于我们的案例,我们使用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;
}
于 2017-11-14T07:23:34.307 回答
0

我在我的身体参数编码器中做这样的事情

// 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)
于 2020-02-26T13:06:46.253 回答