在 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 【问题描述】:我有一个包含 NSString
和 NSDate
数据的 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 的对象必须具有以下属性:
***对象是
NSArray
或NSDictionary
。所有对象都是
NSString
、NSNumber
、NSArray
、NSDictionary
或NSNull
的实例。所有字典键都是
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];
归根结底,您必须告诉我们您的网络服务期望日期被格式化的格式,然后我们可以帮助您进行相应的格式化。
【讨论】:
timeIntervalSinceReferenceDate
和 init(timeIntervalSinceReferenceDate:)
的 NSDate
也做得很好。以上是关于在 NSDictionary 中传递 NSDate 并转换为 NSData 以进行 jsondata 修复的主要内容,如果未能解决你的问题,请参考以下文章
如何通过数组对象的 NSDate 日期将 NSArray 拆分为 NSDictionary?
WebScriptObject 传递 NSDictionary(关联数组/对象)
如何将 NsDictionary 值从 tableview 传递到下一个视图