将单个对象插入json文件而不重写整个文件

我正在研究一种方法,该方法使用JSON.NET将马对象添加到JSON格式的马数据库中。 一种选择是将整个文件反序列化为马匹列表,添加新马,然后序列化列表并重写整个文件。 我在下面的代码中实现了这种方法。

// adds a horse to the db public int AddHorse(Horse horse) { // identify and assign next available id to horse var horses = GetAllHorses(); int nextId = horses.Max(h => h.ID) + 1; horse.ID = nextId; // Add horse to list horses.Add(horse); // Write entire list to JSON file. Can I just insert one new horse into the file? using (FileStream fs = File.Open(_jsonHorseDbFilePath, FileMode.Create)) using (StreamWriter sw = new StreamWriter(fs)) using (JsonWriter jw = new JsonTextWriter(sw)) { jw.Formatting = Formatting.Indented; JsonSerializer serializer = new JsonSerializer(); serializer.Serialize(jw, horses); } return nextId; } 

虽然这有效,但对我来说似乎效率低下。 理想情况下,我可以简单地将新的Horse对象插入JSON文件而无需重写所有内容。 但是,我一直在谷歌四处寻找并没有找到办法做到这一点。 有谁知道这是否可能,如果可以的话,我在这种情况下如何处理它?

JSON不是数据库格式,磁盘上的JSON文件只是一个平面文件,其数据恰好是结构化的,允许您将其作为对象在内存中处理。 但是在磁盘上,它只是一个文本文件,并且文件系统不是为了有效地将数据插入到文件中间而设计的,而不是没有对文件系统本身进行非常棘手的操作,正如这里的答案所示。

是的,这是低效的。 如果您想要高效,请使用专为更新而设计的数据库。 但是,对于相对较小的JSON文件,如果将整个文件保存到磁盘只需要几分之一秒,那么这种理论上的低效率可能毫无意义。

不,你不能,因为序列化程序应该读取整个文件来完成构建JSON对象结构。 同时,这可以通过手动文本文件编辑来完成,但这个解决方案将是值得怀疑的。 如果您想要快速读/写数据,也许您应该考虑其他数据结构forms,例如,在数据库中保持匹配。