使用DataContractJsonSerializer将元素附加到JSON文件中的数组

3
我将使用标准的C#库来处理JSON。我希望能够保存程序中的一些数据以备后续使用,并决定将它们保存为JSON格式。但每次添加新数组时,都会创建一个新的文件。如何确保新元素被添加到旧数组中?我无法理解需要修复什么。
以下是序列化的示例:
private static void writeDeviceInfoInLog(string ipNum, string portNum, string deviceNum)
{
    DeviceTCP device1 = new DeviceTCP(ipNum, portNum, deviceNum);
    DeviceTCP device2 = new DeviceTCP(ipNum, portNum, deviceNum);
    DeviceTCP[] devices = new DeviceTCP[] { device1, device2 };
    DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer(typeof(DeviceTCP[]));

    using (FileStream fs = new FileStream("0.json", FileMode.Append))
    {
        jsonFormatter.WriteObject(fs, devices);
    }
}

这是输出文件:

[{
    "IpDevice":"1","NumberDevice":"3","PortDevice":"2"
},{
    "IpDevice":"1","NumberDevice":"3","PortDevice":"2"
}]
[{
    "IpDevice":"1","NumberDevice":"3","PortDevice":"2"
},{
    "IpDevice":"1","NumberDevice":"3","PortDevice":"2"
}]

3
FileMode.Append 只会在文件末尾追加内容,它并不了解 JSON 的格式。你需要先处理 JSON 然后再添加到文件中。 - Daniel A. White
jsonFormatter将设备(这是一个数组)转换为json字符串,然后将该字符串附加到文件中。您需要的是追加该json数据,然后将其写入文件。您需要对其进行反序列化、合并并重新写入文件。例如,您可以查看Json.Net https://www.newtonsoft.com/json/help/html/MergeJson.htm - buxter
你需要从文件中读取并将设备反序列化为列表。向列表添加新项。将整个数组序列化并写回文件。或者你需要以编程方式操作文件。 - CodingYoshi
将文件指针设置为倒数第二个位置,即 fs.Seek(-1, SeekOrigin.End),以覆盖结束数组字符并将逗号字符写入文件流中。然后将您的 JSON 序列化到内存流中,而不是文件流中,之后将内存流位置设置为 1,以忽略新的开始数组字符,并最终调用 MemoryStream.CopyTo 将其附加到文件中。 - ckuri
1个回答

1
您需要先从文件中读取旧数组,然后用新数组覆盖它。例如(如果您确定文件已经存在并包含有效的JSON):
DeviceTCP[] oldArray;
using (var fs = new FileStream("0.json", FileMode.Open))
{
    oldArray = (DeviceTCP[])jsonFormatter.ReadObject(fs);
}

using (var fs = new FileStream("0.json", FileMode.OpenOrCreate))
{
    jsonFormatter.WriteObject(fs, oldArray.Concat(devices).ToArray());
}

这可能不是最有效的方法,特别是如果您经常需要这样做。在这种情况下,您可以考虑在内存中处理数组,并且只在完成时将其写入文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接