我在使用 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();
}
如何将数组中每个对象的属性写入文件,并在它们之间添加换行符?
的一种方法是对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
如果事实证明您在左大括号和右大括号{}
和/或方括号[]
之后还需要额外的换行符,您可以以相同的方式覆盖WriteStartObject
、WriteEndObject
、WriteStartArray
和WriteEndArray
方法。