【问题标题】:Pass NSDate in NSDictionary and convert into NSData for jsondata fix在 NSDictionary 中传递 NSDate 并转换为 NSData 以进行 jsondata 修复
【发布时间】: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?

标签: ios objective-c json nsdate nsdictionary


【解决方案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 也做得很好。
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 2011-07-27
相关资源
最近更新 更多