2013-08-28 14 views
5

Sto cercando di formattare {"key" => "value"} per trasformarlo in:In Ruby, come JSON uscita dal cancelletto e dargli interruzioni di riga e le tabulazioni

{ 
    "key" : "value" 
} 

per la scrittura in un file JSON. in questo momento sto facendo:

hash = {"key" => "value"} 
puts hash.to_json.gsub('{', '{\n\t') 

per iniziare. e questo produce

{\n\t"key":"value"} 

Perché non posso interrompere la linea?

+1

Fyi, il motivo per cui '\ n' non è stato espanso in una nuova riga è che si utilizzano virgolette singole. Usa invece le doppie virgolette. – Ajedi32

+0

@ Ajedi32 Provato usando doppie virgolette, mi dà ancora un "\ n" effettivo invece di un'interruzione di riga –

+0

Se stai verificando che in IRB, questo è perché le stringhe visualizzate come "risultato" in IRB vengono convertite usando 'String # inspect prima che vengano stampati sulla console. Prova questo: 'puts '\ n \ n \ n'' contro' puts "\ n \ n \ n" '. – Ajedi32

risposta

12

Yay per cose belle e yay per evitare regexen!

utilizzare il built-in JSON.pretty_generate metodo

require 'json' 
puts JSON.pretty_generate hash, options 

Yay!

Ecco le opzioni:

  • indent: una stringa utilizzata per livelli di rientro (default: ''),
  • space: una stringa che viene messo dopo, un : o , delimitatore (default: '') ,
  • space_before: una stringa che si rivolge ad un : coppia delimitatore (default: ''),
  • object_nl: una stringa che viene inserita alla fine di un oggetto JSON (default: ''),
  • array_nl: una stringa che è messo alla fine di una matrice JSON (default: ''),
  • allow_nan: true se NaN, Infinity e -Infinity devono essere generati, altrimenti viene generata un'eccezione se vengono rilevati questi valori. Le opzioni predefinite sono false.
  • max_nesting: la profondità massima di nidificazione consentita nelle strutture dati da cui deve essere generato JSON. Disabilitare il controllo della profondità con :max_nesting => false, per impostazione predefinita è 100.
+0

In realtà questo non fornisce le interruzioni di riga come pretty_generate fa –

+0

@GeorgeAnandaEman nice catch; grazie – naomik

3

Come @naomik menziona, provare a utilizzare il comando incorporato JSON.pretty_generate con una scheda per l'opzione "rientro", ad esempio:

require 'json' 
h = {:key => :value} 
puts JSON.pretty_generate(h, :indent => "\t") 
# { 
#   "key": "value" 
# } 

I valori per la "opta" argomento pretty_generate sono documentati in generate .

+0

Scoperta interessante; Ho pubblicato una soluzione di follow-up con le tue informazioni (per esempio: "JSON.generate") – naomik

+0

Non importa; Non ero corretto con le mie chiacchiere. – naomik

1

Per entrambe le interruzioni di riga e le tabulazioni, provare

require 'json' 
hash = {foo: 'bar'} 
JSON.pretty_generate(hash, {indent: "\t", object_nl: "\n"}) 

NB! Se si utilizzano virgolette singole con righe nuove ("\ n") o schede ("\ t") non saranno interpretate come nuove righe ma come una stringa normale contenente una barra rovesciata e una lettera. Questo è un errore comune. :)

Problemi correlati