2011-12-13 2 views
9

Ho provato questo utilizzando Jsonkit e il serializzatore JSON di Apple senza fortuna. Continua a rompere con la proprietà geo, che è un naranghera di NSNumbers.Come faccio a serializzare JSON un dizionario NSDate in 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]; 

UPDATE: Controllo sull'errore è la NSDate che fallisce su, non il NSArray. Come posso passare alla formattazione della data nella funzione?

UPDATE 2: ok Solved- guardato al più tardi impegnarsi per jsonkit e vide che si potrebbe fare questo:

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]; 

, che sembra aver funzionato, ma presente che questa funzione per JSONKit è WIP così potrebbe cambiare nella prossima versione ufficiale.

+3

Che cosa si intende quando si dice "si continua a rompere"? È un incidente? Non sta creando stringhe JSON come ti aspetti? Cosa stai vedendo? –

+0

Suggerisco di provare a far funzionare JSONKit o il serializzatore JSON su iOS5 invece di far ruotare il parser per così dire. Che problemi hai avuto con JSONKit? –

+0

Ho provato il codice precedente con JSONKit, in return nil quando chiamo JSONDATA e JSONString. Se lascio fuori il NSArray, funziona bene. Se serializzo solo il nsarray funziona benissimo restituendo la serializzazione corretta ... sembra solo un problema se ho un nsarray come valore nel nsdictionary e cerco di serializzare il nsdictionary. – MonkeyBonkey

risposta

7

Hmmmm - non può parlare per JSONKit o iOS5 - Uso il framework SBJSON di Stig. Con esso l'implementazione è piuttosto succinta:

@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 

e

- (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]; 
} 

produce

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

Nel caso in cui qualcuno non se ne accorga, il formato dataFormatter non è corretto. I minuti sono definiti usando "mm", non "MM". – redent84

+0

sintassi corretta - thx. – jstevenco

0

Dovete moltiplicare il numero di secondi per 1000 per ottenere il numero lungo corretto da inviare al il tuo lato server (o qualsiasi altra cosa).

[NSNumber numberWithLongLong:[yourDate timeIntervalSince1970]*1000] 

Esempio:

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

solo se il tuo server si aspetta millisecondi – malhal