Как сохранить файл JSON с четырьмя отступами в пространстве с помощью JSON.NET?
Мне нужно прочитать файл конфигурации JSON, изменить значение и затем снова сохранить измененный JSON в файл. JSON так же просто, как и он:
{
"test": "init",
"revision": 0
}
Чтобы загрузить данные и изменить значение, я делаю это:
var config = JObject.Parse(File.ReadAllText("config.json"));
config["revision"] = 1;
До сих пор так хорошо; теперь, чтобы записать JSON обратно в файл. Сначала я попробовал это:
File.WriteAllText("config.json", config.ToString(Formatting.Indented));
Что записывает файл правильно, но отступом является только два пробела.
{
"test": "init",
"revision": 1
}
Из документации, похоже, нет способа передать какие-либо другие варианты таким образом, поэтому я попытался изменить этот пример, который позволил бы мне напрямую установить Indentation
и IndentChar
свойства JsonTextWriter
, чтобы указать количество отступов:
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());
}
}
}
Но это, похоже, не имеет никакого эффекта: файл все еще написан с двухступенчатым отступом. Что я делаю неправильно?
Ответы
Ответ 1
Проблема заключается в том, что вы используете config.ToString()
, поэтому объект уже сериализуется в строку и отформатирован при записи с помощью JsonTextWriter
.
Используйте сериализатор для сериализации объекта для записи:
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(jw, config);
Ответ 2
Может быть, попробуйте передать символ табуляции в IndentChar?
...
jw.IndentChar = '\t';
...
В соответствии с документацией, он должен использовать символ табуляции, чтобы вставить JSON вместо символа пробела.
http://james.newtonking.com/json/help/index.html?topic=html/T_Newtonsoft_Json_Formatting.htm
Ответ 3
Я столкнулся с той же проблемой и выяснил, что WriteRaw не влияет на настройки отступа, однако вы можете решить проблему, используя WriteTo в JObject
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;
config.WriteTo(jw);
}
}
}