【问题标题】:How do I write to a new line in a JSON file? C# [duplicate]如何在 JSON 文件中写入新行? C# [重复]
【发布时间】:2018-07-14 04:15:53
【问题描述】:

所以我目前正在创建一个带有清除命令的 Discord 机器人。但是,我想将删除消息的时间、作者和数量作为日志写入文件。

我为此使用 Newtonsoft.Json,我的代码不变。

using (StreamWriter file = File.CreateText(@"C:\Users\COCON\source\repos\DiscordAdmin\DiscordAdmin\Logs\Purge.json")) //create json file at this path.
        {
            JsonSerializer serializer = new JsonSerializer();
            //serialize object directly into file stream
            serializer.Serialize(file, LocalTime + ": " + Sender + " has executed the purge command on " + message + " messages"); //Serialize the time, the author of the command and how many messages they purged
        }

这段代码的问题是每次它尝试记录给定的命令时,它只会覆盖第一个日志。那么我如何强制它每次都写入一个新行呢?我希望继续使用这种方法。

【问题讨论】:

  • File.CreateText 将创建一个新文件并覆盖任何现有文件。请注意,如果您这样做,您将无法神奇地反序列化文件,您必须逐行手动进行
  • 您每次都在创建。您可以附加到文件名以每次创建不同的文件或使用 System.IO.File.WriteAllText(filePath, jsonData);只写入已经存在的文件
  • @JoshAdams 谢谢,改变了它,所以如果没有文件,它会创建一个然后写入它,如果有它只是忽略创建一个并用新行直接写入它!
  • 很高兴我能帮上忙!你想让我发布一个解决方案还是你可以发布你自己的:)

标签: c# json serialization json.net discord


【解决方案1】:

编辑: 我之前的回答(如下)解决了上述问题。但正如评论中指出的那样,它不会产生有效的 json 文件。在文件的每一行中只有有效的 json。以下将生成一个包含多个条目的有效 json 文件:

List<object> log = new List<object>();
            JsonSerializer serializer = new JsonSerializer();
        string path = @"C:\Users\COCON\source\repos\DiscordAdmin\DiscordAdmin\Logs\Purge.json";

        if (System.IO.File.Exists(path))
        {
            using (System.IO.StreamReader reader = new System.IO.StreamReader(path))
            {
                Newtonsoft.Json.JsonReader jreader = new Newtonsoft.Json.JsonTextReader(reader);
                log = serializer.Deserialize<List<object>>(jreader);
            }
        }

        using (System.IO.StreamWriter file =
        new System.IO.StreamWriter(path, false))
        {
            object logEntry = LocalTime + ": " + Sender + " has executed the purge command on " + message + " messages";
            log.Add(logEntry);

            serializer.Serialize(file, log); //Serialize the time, the author of the command and how many messages they purged
        }

上一个答案:(每行生成有效的 json,但不是有效的 json 文件)

using (System.IO.StreamWriter file =
        new System.IO.StreamWriter(@"C:\Users\COCON\source\repos\DiscordAdmin\DiscordAdmin\Logs\Purge.json", true))
        {
            JsonSerializer serializer = new JsonSerializer();
            //serialize object directly into file stream
            serializer.Serialize(file, LocalTime + ": " + Sender + " has executed the purge command on " + message + " messages"); //Serialize the time, the author of the command and how many messages they purged
        }

true”值表示追加,而不是创建新文件或覆盖。似乎 CreateText 没有该选项。 来自 File.CreateText 文档:

这个方法等价于StreamWriter(String, Boolean) 将 append 参数设置为 false 的构造函数重载。

File.CreateText

StreamWriter (String, Boolean)

【讨论】:

  • 请注意,这将产生无效的 JSON(但您显然知道,因为这正是您想要的)...
  • 有效的 json,每一个单独的一行。如果将整个文件作为单个 json 对象读取,则无效。
  • “那么我如何强制它每次都写入一个新行?”按照要求。
  • 您的回答并不清楚...(现在仍然不是...)显然OP对此一无所知,因为他们将接受的支票转移到了我认为不太有用的答案...旁注:虽然您的答案确实很好,但已经有很多“如何附加到文件”的答案 - 因此,如果您想提供特定的特殊情况处理,请考虑将其标记为重复或至少参考现有答案。
  • 我同意你的看法。我编辑了我的答案,以展示如何实现具有多个条目的有效 json 文件的一种可能解决方案。
【解决方案2】:

你每次都在创造。您可以附加到文件名以每次创建不同的文件或使用 System.IO.File.WriteAllText(filePath, jsonData);只写入已经存在的文件

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 2017-02-04
    • 2016-12-07
    • 2013-04-22
    • 2017-08-15
    相关资源
    最近更新 更多