Как мне JSON сериализовать словарь NSDate в JSONKit - PullRequest
10 голосов
/ 13 декабря 2011

Я попробовал это, используя Jsonkit и сериализатор JSON от Apple, но не повезло.Он продолжает работать со свойством geo, которое является nsarray из 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];

UPDATE: проверка на ошибку - это 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 ]

7 голосов
/ 14 декабря 2011

Хмммм - не могу говорить за 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 caption", "uname": "Mike", "geo": [37.78583, -122.4064]}

0 голосов
/ 08 января 2013

Вам нужно умножить количество секунд на 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];
...