【问题标题】:Add new line after each object in a JSON array when printing to file打印到文件时,在 JSON 数组中的每个对象后添加新行
【发布时间】:2018-12-22 03:50:25
【问题描述】:

我在使用 Git 合并大型 JSON 文件时遇到问题。 Git 似乎无法正确区分大型 JSON 文件。 This solution 在 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();
    }

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

【问题讨论】:

    标签: json json.net


    【解决方案1】:

    解决此问题的一种方法是继承 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);
    }
    

    这是一个工作演示(使用控制台而不是文件):https://dotnetfiddle.net/5ZVom7

    如果在左大括号和右大括号{} 和/或括号[] 之后需要额外的换行符,您可以覆盖WriteStartObjectWriteEndObjectWriteStartArrayWriteEndArray方法相同。

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 2013-03-18
      相关资源
      最近更新 更多