2014-07-07 5 views
7

sto generando testo JSON e durante la generazione di allineamento ho un sacco di backslash non ho bisogno:Rimuovere backslash ('') in Objective-C

[\n  
    {\n    
     \"Speed\" : 2,\n    
     \"Direction\" : 3,\n    
     \"OdometerDelta\" : 4,\n    
     \"Longitude\" : 0,\n    
     \"Latitude\" : 1,\n    
     \"TimeStamp\" : \"1996-06-17\"\n  
    },\n  
    {\n    
     \"Speed\" : 2,\n    
     \"Direction\" : 3,\n    
     \"OdometerDelta\" : 4,\n    
     \"Longitude\" : 0,\n    
     \"Latitude\" : 1,\n    
     \"TimeStamp\" : \"1996-06-17\"\n  },\n  
    {\n    
     \"Speed\" : 2,\n    
     \"Direction\" : 3,\n    
     \"OdometerDelta\" : 4,\n    
     \"Longitude\" : 0,\n    
     \"Latitude\" : 1,\n    
     \"TimeStamp\" : \"1996-06-17\"\n  
    }\n 

] 

Ecco come ho la mia JSON generato NSString testo:

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

Ecco la parte dove le cose si fanno interessanti, se uso

jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 

tutti i "\ n" viene rimosso (backsla sh viene rimosso anche), ma se uso

jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\" withString:@""]; 

tutte le barre retroverse sono ancora lì. Sono abbastanza nuovo all'obiettivo-c quindi non posso nemmeno pensare al possibile modo per cui questo accade, ho provato diversi modi, e nessuno di questi ha funzionato. Il mio colpo al buio è che il problema è causato dalla codifica, ma potrei sbagliarmi.

Ecco come produco il mio file JSON:

for(int i = 0; i < 3; i++) 
    { 

     NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithDouble:0.0], @"Longitude", 
             [NSNumber numberWithDouble:1.0], @"Latitude", 
             @"1996-06-17", @"TimeStamp", 
             [NSNumber numberWithDouble:2.0], @"Speed", 
             [NSNumber numberWithDouble:3.0], @"Direction", 
             [NSNumber numberWithDouble:4.0], @"OdometerDelta", 
             nil]; 


     [arr addObject:jsonDictionary]; 
    } 


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

Grazie in anticipo.

+2

È importante sapere che cosa ha prodotto l'output JSON che hai postato. Ad esempio potrebbe essere qualcosa che sta aggiungendo l'escape per te, al fine di rendere visibili le newline. Quindi per favore specifica come hai ottenuto quell'output. – trojanfoe

+2

Il tuo problema è che apparentemente "serializzi" il JSON due volte. Risolvilo, piuttosto che cercare di disfare le cose dopo l'atto. –

+0

@trojanfoe Ho appena aggiunto il codice su come produco il mio JSON. – MisterMortal

risposta

10

Questa linea

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:&error]; 

Fornisce una stringa JSON con avanzamenti di riga, spazi e rientri per formattarla in modo bello quando la si guarda. È non inserire feed di riga aggiuntivi nei dati. Se si esegue questa operazione:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:0 error:&error]; 

la stringa JSON non avrà nessuna di queste caratteri di formattazione in più e appare essere tutto una linea molto lunga.

L'output che hai postato assomiglia all'output di debug e quelli \n caratteri e \" caratteri sono sfuggiti dalla descrizione di debug. Nella stringa effettiva, sono i caratteri di avanzamento riga (carattere 10) e virgolette corretti. Questo è il motivo per cui la prima dichiarazione di sostituzione funziona perché @"\n" è una stringa di un solo carattere con solo 10 caratteri. Nella tua seconda affermazione, @"\\" è una stringa di un carattere con una barra rovesciata al suo interno e non ci sono backslash effettivi nella stringa JSON.

+0

Probabilmente intendevi "non inserisce extra * backslash * ..." –

+0

@MartinR Con "i dati" intendevo nelle stringhe e nei numeri JSON. Tutti i linefeed nell'esempio nella domanda sono solo formattazione e non fanno differenza per la semantica dei dati rappresentati. – JeremyP

0
sonString = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 

non rimuoverà \ n rimuoverà caratteri di nuova riga, che solleva la questione di come vanno le cose l'uscita di visualizzare, è che ciò che è veramente nella stringa o è che semplicemente informazioni generate in uscita, per mostrare ciò che è un carattere di nuova riga e una citazione invece della fine della stringa.

anche a rimuovere \" dalla stringa si dovrebbe davvero essere in questo

jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\\"" withString:@"\""]; 

altrimenti si corre il rischio di rimozione di \ personaggi che sono supponiamo di essere lì.

+1

Penso che perseguire questa linea non sia corretto; migliore è l'approccio adottato da @HotLicks nei commenti, in cui impedire la fuga in primo luogo è meglio che rimuoverli in seguito. – trojanfoe

+0

La rimozione di \ n non è il problema qui. Il mio problema è che 'stringByReplacingOccurrencesOfString' non funziona nel mio caso, ho provato la cosa che hai appena suggerito e non ha funzionato. – MisterMortal

+0

@MisterMortal - Sostituire le stringhe contenenti '\\' con stringByReplacingOccurrencesOfString è molto difficile. Può essere fatto ma richiede un'attenta considerazione dello scenario. –