如何在 JSONKit 中 JSON 序列化 NSDate 字典
Posted
技术标签:
【中文标题】如何在 JSONKit 中 JSON 序列化 NSDate 字典【英文标题】:How do I JSON serialize an NSDate Dictionary in JSONKit 【发布时间】:2011-12-13 18:19:00 【问题描述】:我尝试使用 Jsonkit 和 Apple 的 JSON 序列化程序,但没有成功。它不断破坏 geo 属性,这是一个 NSNumber 的 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。如何将日期格式化程序传递给函数?
更新 2: Solved- ok 查看了 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 的此功能是 WIP,因此它可能会在下一个正式版本中更改。
【问题讨论】:
当你说“它一直在破碎”是什么意思?是崩溃吗?它没有像您期望的那样创建 JSON 字符串吗?你在看什么? 我建议尝试让 JSONKit 或 ios5 中的 JSON 序列化程序工作,而不是滚动你自己的解析器。您在使用 JSONKit 时遇到了什么问题? 我用 JSONKit 尝试了上面的代码,当我同时调用 JSONDATA 和 JSONString 时返回 nil。如果我省略了 NSArray 它工作正常。如果我只序列化 nsarray 它可以正常返回正确的序列化......如果我在 nsdictionary 中有一个 nsarray 作为值并且我尝试序列化 nsdictionary,这似乎是一个问题。 你在检查返回的错误吗? 向我们展示您的getDictionary
方法,并在JSONStringWithOptions:error:
返回后向我们展示error
中的内容。
【参考方案1】:
嗯——不能代表 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":"New York City","caption":"测试标题","uname":"Mike","geo":[37.78583,-122.4064]
【讨论】:
以防万一有人没有注意到,dateFormatter 格式不正确。分钟使用“mm”定义,而不是“MM”。【参考方案2】:您必须将秒数乘以 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];
【讨论】:
仅当您的服务器预计毫秒数时以上是关于如何在 JSONKit 中 JSON 序列化 NSDate 字典的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 JSONKit 从 ASP.NET JSON 日期格式转义反斜杠?