我如何JSON序列化JSONKit中的NSDate字典

我试过这个使用Jsonkit和苹果的JSON序列化器没有运气。 它不断打破地理属性,这是一个NSNumbers nsarray。

Post* p = [[Post alloc] init]; p.uname = @"mike"; p.likes =[NSNumber numberWithInt:1]; p.geo = [[NSArray alloc] initWithObjects:[NSNumber numberWithFloat:37.78583], [NSNumber numberWithFloat:-122.406417], nil ]; p.place = @"New York City"; p.caption = @"A test caption"; p.date = [NSDate date]; NSError* error = nil; NSString* stuff = [[p getDictionary] JSONStringWithOptions:JKParseOptionNone error:&error]; 

更新:检查错误是它失败的NSDate,而不是NSArray。 如何将date格式化程序传递到函数中?

更新2:解决 – 好了看着jsonkit的最新提交,看到你可以这样做:

  NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; [outputFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZZZ"]; NSString* result = [p.dictionary JSONStringWithOptions:JKSerializeOptionNone serializeUnsupportedClassesUsingBlock:^id(id object) { if([object isKindOfClass:[NSDate class]]) { return([outputFormatter stringFromDate:object]); } return(nil); } error:nil]; 

这似乎工作,但请注意,JSONKit这个function是WIP所以它可以改变在下一个正式版本。

嗯 – 不能说JSONKit或iOS5 – 我使用Stig的SBJSON框架。 使用它的实现相当简洁:

 @implementation Post - (id) initWithName:(NSString*)Name :(NSNumber*)Likes :(NSArray*)Geo :(NSString*)Place :(NSString*)Caption :(NSDate*)Date { if ((self=[super init])==nil) { return nil; } uname = Name; likes = Likes; geo = Geo; place = Place; caption = Caption; date = Date; return self; } - (NSDictionary*) getAsDictionary { NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *dateString = [dateFormatter stringFromDate:[NSDate date]]; [dateFormatter release]; NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:uname,@"uname", likes,@"likes", geo,@"geo", place,@"place", caption,@"caption", dateString,@"date", nil]; return dict; } @end 

 - (void)viewDidLoad { [super viewDidLoad]; Post* post = [[Post alloc] initWithName:@"Mike" :[NSNumber numberWithInt:1] :[[NSArray alloc] initWithObjects:[NSNumber numberWithFloat:37.78583], [NSNumber numberWithFloat:-122.406417],nil] :@"New York City" :@"A Test caption" :[NSDate date]]; SBJsonWriter *writer = [[SBJsonWriter alloc] init]; NSString* json = [writer stringWithObject:[post getAsDictionary]]; if (json == nil) { NSLog(@"error = %@",writer.errorTrace); } NSLog(@"json = %@",json); [writer release]; [post release]; } 

产生

TestJSON [52337:207] json = {“likes”:1,“date”:“2011-12-13 11:12:57”,“place”:“纽约市”,“caption”:“A Test caption ”, “UNAME”: “迈克”, “地理位置”:[37.78583,-122.4064]}

你必须乘以秒数1000以获得正确的长号码发送到您的服务器端(或其他)。

 [NSNumber numberWithLongLong:[yourDate timeIntervalSince1970]*1000] 

例如:

 NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:uname,@"uname", likes,@"likes", geo,@"geo", place,@"place", caption,@"caption", [NSNumber numberWithLongLong:[yourDate timeIntervalSince1970]*1000],@"date", nil];