在 NSDictionary 中传递 NSDate 并转换为 NSData 以进行 jsondata 修复

Posted

技术标签:

【中文标题】在 NSDictionary 中传递 NSDate 并转换为 NSData 以进行 jsondata 修复【英文标题】:Pass NSDate in NSDictionary and convert into NSData for jsondata fix 【发布时间】:2016-01-25 14:45:33 【问题描述】:

我有一个包含 NSStringNSDate 数据的 json (dob) 我创建了一个NSDictionary,但是当我使用代码将其转换为数据时

 NSData *requestData1 = [NSJSONSerialization dataWithJSONObject:json_inputDic options:0 error:&error];

它通过给出错误杀死

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

我的问题是我需要通过 dob,因为 NSDate 是强制性的。我该如何解决?

例如

   NSDate *newDate = [NSDate date];
    [dic setValue:newDate forKey:@"dob"];


    NSString *good = @"good";

    [dic setValue:good forKey:@"good"];

    NSLog(@"dic=%@",dic);
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error]; //it gives error

    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSLog(@"jsonData as string:\n%@", jsonString);

【问题讨论】:

为什么不将 NSDate 转换为所需格式的 NSString 并从中创建 JSON 数据。 它需要通过 API 传递,因为它被强制为 NSDate 当然,dob 可能是NSDate,但假设您将其发送到某个网络服务,那么该网络服务器可能甚至不知道NSDate 是什么。它有自己的日期数据类型。问题是这个 Web 服务希望以什么格式来表示生日。是yyyy-MM-dd吗? dd/MM/yyyy?甚至可能只是dd/MM? 【参考方案1】:

NSDate 无法以原生方式表示为 JSON。正如NSJSONSerialization 文档所说:

可以转换为 JSON 的对象必须具有以下属性:

***对象是NSArrayNSDictionary

所有对象都是NSStringNSNumberNSArrayNSDictionaryNSNull 的实例。

所有字典键都是NSString 的实例。

数字不是 NaN 或无穷大。

您的问题不清楚日期应以何种格式在 JSON 中表示。通常,您会以某些标准日期字符串格式(例如 ISO 8601/RFC 3339 格式,如 2016-01-25T06:54:00Z)来格式化日期。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZZZZZ";

或者,对于 macOS 10.12 和 ios 10,您可以这样做:

NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];

然后:

NSString *birthDateString = [formatter stringFromDate:birthDate];

更多信息请参见Apple Technical Q&A 1480。

或者,因为是生日,你只需要yyyy-MM-dd

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
formatter.dateFormat = @"yyyy-MM-dd";
NSString *birthDateString = [formatter stringFromDate:birthDate];

归根结底,您必须告诉我们您的网络服务期望日期被格式化的格式,然后我们可以帮助您进行相应的格式化。

【讨论】:

timeIntervalSinceReferenceDateinit(timeIntervalSinceReferenceDate:)NSDate 也做得很好。

以上是关于在 NSDictionary 中传递 NSDate 并转换为 NSData 以进行 jsondata 修复的主要内容,如果未能解决你的问题,请参考以下文章

如何通过数组对象的 NSDate 日期将 NSArray 拆分为 NSDictionary?

传递 NSDate

WebScriptObject 传递 NSDictionary(关联数组/对象)

如何将 NsDictionary 值从 tableview 传递到下一个视图

将 NSData 与 NSDictionary 参数一起传递给 Web 服务

从 NSDictionary 传递的 iOS 数据为 (null) - JSON 源