【问题标题】:Can't serialize NSDate with CJJsonSerializer无法使用 CJJsonSerializer 序列化 NSDate
【发布时间】:2013-01-19 11:53:25
【问题描述】:

我尝试将NSDate 添加到NSMutableDictionary,然后使用以下方法使其成为JSon 字符串:

NSMutableDictionary *d = [[NSMutableDictionary alloc]init];
[d setObject:[NSDate date] forKey:@"date"];
NSData *jsondata = [[CJSONSerializer serializer] serializeDictionary:d error:nil];
NSString *requestBody = [[[NSString alloc] initWithData:jsondata encoding:NSUTF8StringEncoding] autorelease];

我有几个问题: 1) jsondata 为零,然后requestBody 也为零。 2) [NSDate date] 让我搞错了日期,不像我 iPhone 上的日期:

2013-01-19 11:48:46 +0000

对这个问题有帮助吗?

编辑:

当我打印错误时,我得到了这个消息:

Error Domain=TODO_DOMAIN Code=-1 "Cannot serialize data of type '__NSDate'" UserInfo=0x177850 {NSLocalizedDescription=Cannot serialize data of type '__NSDate'}

做不到吗?

【问题讨论】:

  • 如果出现问题,检查error 参数的设置很有用。你正在传递nil;尝试传递对NSError * 变量的引用(即NSError *e = nil,然后将&e 传递给错误参数),然后查看它的设置。关于您的第二个问题,它与this question 重复。
  • 我用更多信息编辑我的帖子.....

标签: iphone ios objective-c touchjson


【解决方案1】:

字典似乎不太可能无法插入日期。问题似乎更可能出在CJSONSerializer

尝试以下方法:

NSMutableDictionary *d = [[NSMutableDictionary alloc]init];
[d setObject:[NSDate date] forKey:@"date"];

NSError *error = nil;
NSData *jsondata = [[CJSONSerializer serializer] serializeDictionary:d error:&error];

if (!jsonData)
{
    NSLog(@"Error %@ while serialising to JSON");
}

NSString *requestBody = [[[NSString alloc] initWithData:jsondata encoding:NSUTF8StringEncoding] autorelease];

您应该会看到一个错误打印到控制台。

更新

好的,看起来我们是对的,CJSONSerializer 不能序列化日期。所以你需要把你的日期变成一个字符串。这是通过 NSDateFormatter 完成的。

NSMutableDictionary *d = [[NSMutableDictionary alloc]init];
NSDate *date = [NSDate date];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss z"];
NSString *dateString = [dateFormatter stringFromDate:date];

[d setObject:dateString forKey:@"date"];

NSError *error = nil;
NSData *jsondata = [[CJSONSerializer serializer] serializeDictionary:d error:&error];

if (!jsonData)
{
    NSLog(@"Error %@ while serialising to JSON");
}

NSString *requestBody = [[[NSString alloc] initWithData:jsondata encoding:NSUTF8StringEncoding] autorelease];

希望您现在应该在 JSON 中获得格式化的日期。您可以通过更改传递给stringWithDate: 的字符串来改变格式。如果您经常这样做,则需要一个日期格式化程序,因为创建它们的成本很高。

【讨论】:

    【解决方案2】:

    JSON 不支持将日期作为标准类型,因此无法自动序列化 NSDate。您必须传递日期的字符串表示或数字时间戳表示。例如,您可以通过执行以下操作将其序列化为时间戳:

    [d setObject:@([[NSDate date] timeIntervalSince1970]) forKey:@"date"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2011-06-27
      • 1970-01-01
      • 2013-09-09
      相关资源
      最近更新 更多