Подтвердить что ты не робот

Как сохранить файл 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());
        }
    }
}

Но это, похоже, не имеет никакого эффекта: файл все еще написан с двухступенчатым отступом. Что я делаю неправильно?

4b9b3361

Ответ 1

Проблема заключается в том, что вы используете config.ToString(), поэтому объект уже сериализуется в строку и отформатирован при записи с помощью JsonTextWriter.

Используйте сериализатор для сериализации объекта для записи:

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

Ответ 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);
        }
    }
}