2014-07-16 15 views
7

Sto scrivendo una prova in cui voglio mettere a confronto il risultato di json.Marshal con una stringa JSON statica:Come rimuovere tutti gli spazi, i newline, le schede dall'array di byte?

var json = []byte(`{ 
    "foo": "bar" 
}`) 

Come il risultato di json.Marshal non ha \n, \t e spazi pensavo di poter fare facilmente:

bytes.Trim(json, " \n\t") 

per rimuovere tutti questi caratteri. Tuttavia sfortunatamente questo non funziona. Potrei scrivere una funzione di assetto personalizzato e usare bytes.TrimFunc ma questo mi sembra complicato.

Che altro potevo fare per avere una stringa JSON "compresso" con quanto meno codice possibile?

migliore, Bo

+2

Hai bisogno di un funzione di sostituzione, non una funzione di taglio. Ma cosa succede se hai spazi all'interno di chiavi e valori? come puoi dire se sei dentro una chiave/valore o no? non puoi farlo senza scrivere un parser JSON :) quindi sei bloccato in un loop qui, a meno che tu non sia sicuro al 100% che tutti gli spazi nel json siano padding e non in chiavi/valori. in caso contrario, basta usare 'strings.Replace' :) –

+1

Dal momento che è un array di byte e non una stringa è possibile utilizzare' bytes.Replace' invece. –

risposta

12

L'utilizzo di qualsiasi taglio o sostituire la funzione non funziona nel caso in cui non ci sono spazi all'interno stringhe JSON. Romperebbe i dati, ad esempio se hai qualcosa come {"foo": "bar baz"}.

Basta usare json.Compact.

Questo fa esattamente quello che ti serve, tranne che in uscita ad un bytes.Buffer.

var json_bytes = []byte(`{ 
    "foo": "bar" 
}`) 
buffer := new(bytes.Buffer) 
if err := json.Compact(buffer, json_bytes); err != nil { 
    fmt.Println(err) 
} 

Vedere http://play.golang.org/p/0JMCyLk4Sg per un esempio dal vivo.

+0

Grazie per la soluzione semplice. Esattamente la cosa che stavo cercando. – bodokaiser

+0

Bello, mai realizzato json.Compact esisteva anche. –

Problemi correlati