Как мне JSON сериализовать словарь NSDate в JSONKit
Я попробовал это, используя Jsonkit и JSON-сериализатор от Apple, но не повезло. Он продолжает нарушать свойство geo, которое представляет собой массив NSNumbers.
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: Решено - хорошо, посмотрел последний коммит для 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, поэтому она может измениться в следующем официальном выпуске.
2 ответа
Хмммм - не могу говорить за JSONKit или iOS5 - я использую Stig's SBJSON framework. С его помощью реализация довольно лаконична:
@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":"Подпись Test" ", "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];