2014-09-11 15 views
13

Potrzebuję odczytać plik konfiguracyjny JSON, zmodyfikować wartość, a następnie ponownie zapisać zmodyfikowany JSON z powrotem do pliku. JSON jest tak proste, jak to się robi:Jak zapisać plik JSON z czterema wcięciami spacji za pomocą JSON.NET?

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

Aby wczytać dane i zmodyfikować wartość to zrobić:

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

tej pory tak dobrze; teraz, aby napisać JSON z powrotem do pliku. Najpierw próbowałem tego:

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

Który zapisuje plik poprawnie, ale wcięcie to tylko dwie spacje.

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

Z dokumentacji, wygląda na to nie ma sposobu, aby przekazać wszelkie inne opcje w ten sposób, więc próbowałem modyfikując this example które pozwoliłyby mi bezpośrednio ustawić Indentation i IndentChar właściwości JsonTextWriter określić ilość wcięcia:

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()); 
     } 
    } 
} 

Ale to nie wydaje się mieć żadnego efektu: plik jest nadal zapisany z dwoma wcięciami. Co ja robię źle?

Odpowiedz

12

Problem polega na tym, że używasz config.ToString(), więc obiekt jest już w odcinkach na ciąg znaków i formatowania podczas pisania go za pomocą JsonTextWriter.

Użyj serialiser do serialise obiekt pisarza zamiast:

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

Tak, to było to: teraz wskazałeś, że to ma sens. Dzięki! –