Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将新数据追加到现有JSON文件_C#_.net_Json_Microsoft Metro - Fatal编程技术网

C# 将新数据追加到现有JSON文件

C# 将新数据追加到现有JSON文件,c#,.net,json,microsoft-metro,C#,.net,Json,Microsoft Metro,我到处寻找这个问题的解决方案,在过去的几周里我一直在尝试实现我自己的解决方案,但我什么都想不出来 我将非常感谢任何帮助 我有一个文件,看起来像,(file.json): 在我的应用程序中,当我创建一个新的“费用”时,我想将这个新的费用附加到这个现有的JSON文件中,看起来是这样的: { "Expense": { "Name": "OneTel Mobile Bill", "Amount": "39.90", "Due": "28/12/2011", "Recu

我到处寻找这个问题的解决方案,在过去的几周里我一直在尝试实现我自己的解决方案,但我什么都想不出来

我将非常感谢任何帮助

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

在我的应用程序中,当我创建一个新的“费用”时,我想将这个新的费用附加到这个现有的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);

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

由于您可以直接读取到
费用对象中,您应该能够将此类对象添加到
列表中
-将新数据作为
费用对象添加到列表中(直接从表单数据或其他方式)

此时,您应该能够使用JSON.NET写出
列表
——它应该负责创建列表


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

您曾经从文件中读取过数据吗?您曾经将数据反序列化为对象吗?我已经更新了我的问题,并包括如何从文件中读取数据。但是,这是另一个问题;我知道如何读取1“费用”,但是现在我不知道如何从一个文件中读取多个费用的值。谢谢你的提问。谢谢@Oded。因此,如果我理解正确,我可以从文件中读取,将其转换为列表,添加新数据,然后再次将其保存到该文件中;用所有内容覆盖该文件的现有内容?@Jason-JSON.NET应该能够直接与返回到
列表
,您已经完全理解了。这种方法的唯一问题是,文件越大,性能越差。感谢heaps@Oded!目前,这只是一个个人项目,不会因为性能不足而大惊小怪,但随着应用的发展,我肯定会寻找一个更合适的approach.谢谢@Fossmo,等我有足够的声誉再回来投票。@Jason你再也没回来过:P
        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);