2013-07-23 12 views
18

Nella mia aplicazione iPhone ho un elenco di oggetti personalizzati. Devo creare una stringa JSON da loro. Come posso implementarlo con SBJSON o iPhone SDK?crea una stringa json da NSArray

NSArray* eventsForUpload = [app.dataService.coreDataHelper fetchInstancesOf:@"Event" where:@"isForUpload" is:[NSNumber numberWithBool:YES]]; 
    SBJsonWriter *writer = [[SBJsonWriter alloc] init]; 
    NSString *actionLinksStr = [writer stringWithObject:eventsForUpload]; 

e ottengo risultati vuoto.

+0

Definire "oggetti personalizzati". –

+0

qual è il problema che hai in questo dato codice ?? –

+0

Ottengo risultato vuoto – revolutionkpi

risposta

0

Prova in questo modo,

- (NSString *)JSONRepresentation { 
    SBJsonWriter *jsonWriter = [SBJsonWriter new];  
    NSString *json = [jsonWriter stringWithObject:self]; 
    if (!json) 

    [jsonWriter release]; 
    return json; 
} 

poi chiamano questo tipo,

NSString *jsonString = [array JSONRepresentation]; 

speriamo che si aiuta ...

+0

Sospetto che il problema sia " oggetti personalizzati ", che lo scrittore deve in qualche modo sapere come interpretare. Molto più facile se tutto è in array/dizionari. –

+2

Il codice sopra riportato è rotto. O non riuscirà a compilare sotto ARC, perché si chiama release, o si verificherà una perdita di memoria perché si rilascia lo scrittore solo se non si riesce a JSONify 'self'. –

46

Questo processo è molto semplice ora, non si fa utilizzare librerie esterne, In questo modo, (iOS 5 & sopra)

NSArray *myArray; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:myArray options:NSJSONWritingPrettyPrinted error:&error]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
9

Amo il mio categorie in modo da faccio questo genere di cose come segue

@implementation NSArray (Extensions) 

- (NSString*)json 
{ 
    NSString* json = nil; 

    NSError* error = nil; 
    NSData *data = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error]; 
    json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

    return (error ? nil : json); 
} 

@end 
+1

Meglio con un piccolo semplice controllo degli errori: return (error? Nil: json); – anavarroma

0

Sono un po 'tardi per questo partito, ma è possibile puntate un array di oggetti personalizzati implementando il metodo -proxyForJson nella vostra oggetti personalizzati. (O in una categoria sui tuoi oggetti personalizzati.)

Per un example.

4

Sebbene la risposta più votata sia valida per una serie di dizionari o altri oggetti serializzabili, non è valida per gli oggetti personalizzati.

Ecco la cosa, è necessario scorrere l'array e ottenere la rappresentazione del dizionario di ogni oggetto e aggiungerlo a un nuovo array da serializzare.

NSString *offersJSONString = @""; 
if(offers) 
{ 
    NSMutableArray *offersJSONArray = [NSMutableArray array]; 
    for (Offer *offer in offers) 
    { 
     [offersJSONArray addObject:[offer dictionaryRepresentation]]; 
    } 

    NSData *offersJSONData = [NSJSONSerialization dataWithJSONObject:offersJSONArray options:NSJSONWritingPrettyPrinted error:&error]; 

    offersJSONString = [[NSString alloc] initWithData:offersJSONData encoding:NSUTF8StringEncoding] ; 
} 

Per quanto riguarda il metodo di dictionaryRepresentation nella classe Offerta:

- (NSDictionary *)dictionaryRepresentation 
{ 
    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary]; 
    [mutableDict setValue:self.title forKey:@"title"]; 

    return [NSDictionary dictionaryWithDictionary:mutableDict]; 
} 
2

Prova come questo Swift 2,3

let consArray = [1,2,3,4,5,6] 
var jsonString : String = "" 
do 
{ 
    if let postData : NSData = try NSJSONSerialization.dataWithJSONObject(consArray, options: NSJSONWritingOptions.PrettyPrinted) 
    { 
     jsonString = NSString(data: postData, encoding: NSUTF8StringEncoding)! as String 
    } 
} 
catch 
{ 
    print(error) 
}