打印到文件时,在JSON数组中的每个对象后添加新行

打印到文件时,在JSON数组中的每个对象后添加新行,json,json.net,Json,Json.net,我在使用Git合并大型JSON文件时遇到了问题。Git似乎无法正确区分大型JSON文件。在JSON对象中的每个属性之间添加额外的换行符似乎可以解决合并冲突 问题是,我的JSON文件相当大,生成时没有换行符。我也无法控制它是如何生成的。以下是一个示例: "notes":[ { "__type__": "Note", "data": "", "fields": [

我在使用Git合并大型JSON文件时遇到了问题。Git似乎无法正确区分大型JSON文件。在JSON对象中的每个属性之间添加额外的换行符似乎可以解决合并冲突

问题是,我的JSON文件相当大,生成时没有换行符。我也无法控制它是如何生成的。以下是一个示例:

"notes":[
           {
                "__type__": "Note", 
                "data": "", 
                "fields": [
                    "Define virologic suppression in HIV", 
                    "HIV RNA level below limit of assay detection (<20copies/mL", 
                    "", 
                    ""
                ], 
                "flags": 0, 
                "guid": "B4VR%D9qb2", 
                "note_model_uuid": "0aecb5c4-d637-11e7-8e91-408d5c5c9416", 
                "tags": [
                    "InfectiousDiseases"
                ]
            }, 
            {
                "__type__": "Note", 
                "data": "", 
                "fields": [
                    "Define incomplete virological response in HIV", 
                    "Inability to achieve virologic suppression after 24 weeks of therapy (viral load >200 on 2 consecutive samples)", 
                    "", 
                    ""
                ], 
                "flags": 0, 
                "guid": "N{WL%;*sKr", 
                "note_model_uuid": "0aecb5c4-d637-11e7-8e91-408d5c5c9416", 
                "tags": [
                    "InfectiousDiseases"
                ]
            }
]
我正试图编写一个脚本,使用JSON.net添加额外的换行符。以下是我到目前为止的情况:

    static void Main(string[] args)
    {
        using (StreamReader file = File.OpenText(@"fracp-anki.json"))
        using (var reader = new JsonTextReader(file))
        {
            JObject deck = (JObject)JToken.ReadFrom(reader);
            var notes = (JArray)deck["notes"];
            string paddedNotes = writePaddedNotes(notes);
            Console.WriteLine(paddedNotes);
        }

    }

    public static string writePaddedNotes(JArray notes)
    {
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);

        using (JsonWriter writer = new JsonTextWriter(sw))
        {
            foreach (var note in notes.Children<JObject>())
            {
                //what goes here?
            }
        }
        return sb.ToString();
    }
static void Main(字符串[]args)
{
使用(StreamReader file=file.OpenText(@“fracp-anki.json”))
使用(var reader=newjsontextreader(文件))
{
JObject deck=(JObject)JToken.ReadFrom(reader);
变量注释=(JArray)组[“注释”];
string paddedNotes=writePaddedNotes(notes);
控制台写入线(填充注释);
}
}
公共静态字符串writePaddedNotes(JArray notes)
{
StringBuilder sb=新的StringBuilder();
StringWriter sw=新的StringWriter(sb);
使用(JsonWriter=newjsontextwriter(sw))
{
foreach(notes.Children()中的变量note)
{
//这里有什么?
}
}
使某人返回字符串();
}

如何将数组中每个对象的属性写入一个文件,并在它们之间添加一个换行符?

解决这个问题的一种方法是对
JsonTextWriter
进行子类化,并重写
WriteValueDelimiter
方法,以便它在分隔符之后写入一个额外的换行符,如下所示:

class DoubleSpacedValuesJsonWriter : JsonTextWriter
{
    public DoubleSpacedValuesJsonWriter(TextWriter textWriter) : base(textWriter)
    {
        Formatting = Formatting.Indented;
    }

    protected override void WriteValueDelimiter()
    {
        base.WriteValueDelimiter();
        base.WriteWhitespace(Environment.NewLine);
    }
}
然后,您可以创建一个简短的帮助器方法来重新格式化JSON文件,如下所示:

public static void ReformatJsonFile(string filename)
{
    string tempFile = filename + ".tmp";

    using (StreamReader sr = new StreamReader(filename))
    using (JsonReader reader = new JsonTextReader(sr))
    using (StreamWriter sw = new StreamWriter(tempFile))
    using (JsonWriter writer = new DoubleSpacedValuesJsonWriter(sw))
    {
        writer.WriteToken(reader);
    }

    File.Delete(filename);
    File.Move(tempFile, filename);
}
下面是一个工作演示(使用控制台而不是文件):

如果在打开和关闭括号
{}
和/或括号
[]
之后还需要额外的换行符,则可以以相同的方式重写
writeStarObject
WriteEndObject
writeStarray
WriteEndArray
方法