2011-12-13 1 views
9

Я пробовал это с помощью Jsonkit и JSON-сериализатора Apple без везения. Он продолжает ломать свойство geo, которое является nsarray из NSNumbers.Как JSON сериализовать словарь NSDate в JSONKit

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. Как передать форматор даты в функцию?

UPDATE 2: Solved- нормально смотрел на последний коммит для 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, так что может измениться в следующем официальном выпуске.

+3

Что вы имеете в виду, когда вы говорите, "он продолжает ломать"? Это крушение? Разве это не создает строки JSON, как вы ожидаете? Что вы видите? –

+0

Я бы предложил попытаться использовать JSONKit или JSON-сериализатор в iOS5 вместо того, чтобы выкладывать собственный парсер так, чтобы говорить. Какие проблемы у вас были с JSONKit? –

+0

Я пробовал приведенный выше код с помощью JSONKit, в возврате nil, когда я вызываю JSONDATA и JSONString. Если я оставил NSArray, он отлично работает. Если я сериализую только nsarray, он отлично работает, возвращая правильную сериализацию ... это только кажется проблемой, если у меня есть nsarray как значение в nsdictionary, и я пытаюсь сериализовать nsdictionary. – MonkeyBonkey

ответ

7

Hmmmm - не может говорить для JSONKit или iOS5 - я использую рамки Stig's 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":"A Test caption","uname":"Mike","geo":[37.78583,-122.4064]}

+0

На всякий случай кто-то не замечает, формат dateFormatter неверен. Минуты определяются с помощью «мм», а не «ММ». – redent84

+0

исправленный синтаксис - thx. – jstevenco

0

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

, только если ваш сервер ожидает миллисекунды – malhal