【问题标题】:Appending new data to an existing JSON file将新数据附加到现有 JSON 文件
【发布时间】:2011-12-18 10:15:33
【问题描述】:

我已经到处搜索了这个问题的解决方案,并且在过去的几周里一直在尝试实施我自己的解决方案,但我就是想不出任何办法。

如果有任何帮助,我将不胜感激!

我有一个文件,看起来像,(file.json):

{
  "Expense": {
    "Name": "OneTel Mobile Bill",
    "Amount": "39.90",
    "Due": "28/12/2011",
    "Recurrence": "1 Months",
    "Paid": "0",
    "LastPaid": "01/01/2002"
  }
}

在我的应用程序中,当我创建一个新的“费用”时,我想将该新费用附加到这个现有的 JSON 文件中,所以它看起来像这样:

{
  "Expense": {
    "Name": "OneTel Mobile Bill",
    "Amount": "39.90",
    "Due": "28/12/2011",
    "Recurrence": "1 Months",
    "Paid": "0",
    "LastPaid": "01/01/2002"
  },
  "Expense": {
    "Name": "Loan Repayment",
    "Amount": "50.00",
    "Due": "08/03/2012",
    "Recurrence": "3 Months",
    "Paid": "0",
    "LastPaid": "08/12/2011"
  }
}

这就是我创建 JSON 并写入文件的方式:

async public void WriteToFile(string type, string data)
{
    file = await folder.GetFileAsync(file.FileName);
    IRandomAccessStream writestream = await file.OpenAsync(FileAccessMode.ReadWrite);


    IOutputStream outputstream = writestream.GetOutputStreamAt(0);
    DataWriter datawriter = new DataWriter(outputstream);
    datawriter.WriteString(data);

    await datawriter.StoreAsync();
    outputstream.FlushAsync().Start();
}

private void CreateExpenseButton_Click(object sender, RoutedEventArgs e)
{
    //Create the Json file and save it with WriteToFile();
    JObject jobject =
        new JObject(
            new JProperty("Expense",
                new JObject(
                    new JProperty("Name", NameTextBox.Text),
                    new JProperty("Amount", AmountTextBox.Text),
                    new JProperty("Due", DueTextBox.Text),
                    new JProperty("Recurrence", EveryTextBox.Text + " " + EveryComboBox.SelectionBoxItem),
                    new JProperty("Paid", "0"),
                    new JProperty("LastPaid", "Never")
                           )
                         )
                   );
    try
    {
        WriteToFile(Expenses, jobject.ToString());

        // Close the flyout now.
        this.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
    }
    catch (Exception exception)
    {
        Debug.Write(exception.Message);

    }
}

我正在使用 James Newton King 的 Json.NET 库,它非常棒,但即使在阅读了包含的文档之后,我也完全不知道如何读取 JSON 文件并将数据附加到它。

是否有任何示例可以演示这是如何完成的,或者您能否推荐另一个 C# 库来让我完成此操作?

编辑

这就是我从 json 文件中读取单笔费用的方式:

        JObject json = JObject.Parse(data);
        Expense expense = new Expense
        {
            Amount = (string)json["Expense"]["Amount"],
            Due = (string)json["Expense"]["Due"],
            Name = (string)json["Expense"]["Name"]
        };

        Debug.Write(expense.Amount);

【问题讨论】:

  • 你读过文件吗?您是否曾经将数据反序列化为对象?
  • 我已经更新了我的问题并包括了我如何从文件中读取数据。但是,这是另一个问题。我知道如何读取 1 个“费用”,但现在如何从一个文件中的多个费用中读取值。谢谢你的提问。

标签: c# .net json microsoft-metro


【解决方案1】:

您可以尝试将数据反序列化到对象 Expence 并添加数据,然后将对象(对象列表)序列化到文件中。

【讨论】:

  • 谢谢@Fossmo,一旦我有足够的声望,我会稍后回来投票。
  • @Jason 你再也没有回来它接缝:P
【解决方案2】:

由于您可以直接读取Expense 对象,因此您应该能够将此类对象添加到List<Expense> - 将新数据作为Expense 对象添加到列表中(直接从您的表单数据中,或其他)。

此时您应该可以使用 JSON.NET 写出 List<Expense> - 它应该负责创建列表。

我建议您始终保存 List<Expense>,即使它只包含一项,因为它会使序列化和反序列化更容易。

【讨论】:

  • 谢谢@Oded。所以,如果我理解正确,我可以从文件中读取,将其转换为 List,追加新数据,然后将其全部保存到文件中;用所有内容覆盖该文件的现有内容?
  • @Jason - JSON.NET 应该可以直接转换成List<Expense>,你已经完全理解了。这种方法的唯一问题是文件越大性能越差。
  • 感谢@Oded!目前,这只是一个个人项目,不会因为性能不足而大惊小怪,但随着应用程序的发展,我一定会寻找更合适的方法。
猜你喜欢
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2015-05-16
  • 2018-05-14
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
相关资源
最近更新 更多