2014-09-11 18 views
13

Ho bisogno di leggere un file di configurazione JSON, modificare un valore e quindi salvare di nuovo il JSON modificato nel file. Il JSON è così semplice come si arriva:Come faccio a salvare un file JSON con quattro spazi di rientro usando JSON.NET?

{ 
    "test": "init", 
    "revision": 0 
} 

per caricare i dati e modificare il valore faccio questo:

var config = JObject.Parse(File.ReadAllText("config.json")); 
config["revision"] = 1; 

Fin qui tutto bene; ora, per scrivere nuovamente il JSON nel file. Per prima cosa ho provato questo:

File.WriteAllText("config.json", config.ToString(Formatting.Indented)); 

che scrive correttamente il file, ma il rientro è a soli due spazi.

{ 
    "test": "init", 
    "revision": 1 
} 

Dalla documentazione, sembra che non c'è modo di passare tutte le altre opzioni in questo modo, così ho cercato di modificare this example che mi permettesse di impostare direttamente la Indentation e IndentChar proprietà del JsonTextWriter per specificare la quantità di rientro:

using (FileStream fs = File.Open("config.json", FileMode.OpenOrCreate)) 
{ 
    using (StreamWriter sw = new StreamWriter(fs)) 
    { 
     using (JsonTextWriter jw = new JsonTextWriter(sw)) 
     { 
      jw.Formatting = Formatting.Indented; 
      jw.IndentChar = ' '; 
      jw.Indentation = 4; 

      jw.WriteRaw(config.ToString()); 
     } 
    } 
} 

Ma questo non sembra avere alcun effetto: il file è ancora scritto con due spazi rientro. Che cosa sto facendo di sbagliato?

risposta

12

Il problema è che si sta utilizzando config.ToString(), quindi l'oggetto è già serializzato in una stringa formattata e quando si scrive utilizzando il JsonTextWriter.

Utilizzare un serialiser a puntate l'oggetto allo scrittore, invece:

JsonSerializer serializer = new JsonSerializer(); 
serializer.Serialize(jw, config); 
+0

Sì, era così: ora lo hai indicato che ha perfettamente senso. Grazie! –

Problemi correlati