0

我正在尝试使用 json 文件读取和写入数据。我创建了一些类。

public class SimpleTask{...}
public class DayTask{...}
public class DataModel
{
    ...
    private async Task GetSimpleTaskAsync()
    {
        if (_daytask.Count != 0)
            return;
        string fileName = "a.json";
        Uri appUri = new Uri("ms-appx:///"+ fileName);
        StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(appUri);
        string jsonText = await FileIO.ReadTextAsync(file);
        JsonObject jsonObject = JsonObject.Parse(jsonText);
        JsonArray jsonArray = jsonObject["DayTasks"].GetArray();
        foreach (JsonValue daytaskValue in jsonArray)
        {
            JsonObject daytaskObject = daytaskValue.GetObject();
            ObservableCollection<SimpleTask> simpletask = new ObservableCollection<SimpleTask>();
            foreach (JsonValue simpletaskValue in daytaskObject["Tasks"].GetArray())
            {
                JsonObject simpletaskObject = simpletaskValue.GetObject();
                simpletask.Add(new SimpleTask(   simpletaskObject["StartTime"].GetString(),
                                                 simpletaskObject["EndTime"].GetString(), 
                                                 simpletaskObject["Description"].GetString()));
            }
            DayTask daytask = new DayTask(daytaskObject["Day"].GetString(),simpletask);

            this.DayTasks.Add(daytask);
        }
    }


}

如您所见,我有一种方法可以从 a.json 文件中获取数据。我创建了一个 .json 文件: 在此处输入图像描述

在 MainPage.xaml.cs 中,有一个方法调用GetDayTaskAysnc()方法并检索数据:

private async void ReadData1(object sender, TappedRoutedEventArgs e)
    {
        string test = String.Empty;
        var daytask = await DataModel.GetDayTaskAsync();
        foreach (var tasks in daytask)
        {
            test += String.Format("Day:{0}:\n", tasks.Day);
            foreach (var simpletask in tasks.Tasks)
            {
                test += String.Format("\tStart Time: {0}\n", simpletask.StartTime);
                test += String.Format("\tEnd Time: {0}\n", simpletask.EndTime);
                test += String.Format("\tDescription Time: {0}\n", simpletask.Description);
            }
        }
        TextBlock.Text = test;
}

效果很好!但我想将数据写入同一个文件,所以我以硬核方式添加数据:

private List<DayTask> creatList()
    {
        List<DayTask> DayTasks = new List<DayTask>();
        ObservableCollection<SimpleTask> simpletask1 = new ObservableCollection<SimpleTask>();
        simpletask1.Add(new SimpleTask("6AM","7AM","Breakfast"));
        simpletask1.Add(new SimpleTask("8AM", "9AM", "Game"));
        ObservableCollection<SimpleTask> simpletask2 = new ObservableCollection<SimpleTask>();
        simpletask2.Add(new SimpleTask("6AM", "7AM", "Sleep"));
        simpletask2.Add(new SimpleTask("8AM", "9AM", "School"));
        DayTasks.Add(new DayTask ("3/8/2014",simpletask1));
        DayTasks.Add(new DayTask("4/8/2014", simpletask2));
        return DayTasks;
    }
    private async void WriteData(object sender, TappedRoutedEventArgs e)
    {
        string json = "a.json";
        List<DayTask> daytasks = creatList();
        var serializer = new DataContractJsonSerializer(typeof(List<DayTask>));
        var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(json, CreationCollisionOption.ReplaceExisting);
        using (stream)
        {
            serializer.WriteObject(stream, daytasks);
        }

        TextBlock.Text = "Write to Json file succeeded";
    }

当我用窗口手机模拟器运行我的应用程序时,首先,它写入文件。然后我单击读取数据按钮以确保数据写入正确,模拟器显示来自 .json 文件的数据而没有被方法修改WriteData()。我继续创建第二个读取数据方法:

private async void ReadData2(object sender, TappedRoutedEventArgs e)
    {
        string test = String.Empty;
        string json = "a.json";
        string content = String.Empty;
        List<DayTask> mytasks = new List<DayTask>();
        var deserializer = new DataContractJsonSerializer(typeof(List<DayTask>));
        var stream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(json);
        using (stream)
        {
            mytasks = (List<DayTask>)deserializer.ReadObject(stream);
        }
        foreach (var tasks in mytasks)
        {
            test += String.Format("Day:{0}:\n", tasks.Day);
            foreach (var simpletask in tasks.Tasks)
            {
                test += String.Format("\tStart Time: {0}\n", simpletask.StartTime);
                test += String.Format("\tEnd Time: {0}\n", simpletask.EndTime);
                test += String.Format("\tDescription Time: {0}\n", simpletask.Description);
            }
        }
        TextBlock.Text = test;
    }

我多次部署了我的应用程序,这是我的结果:

  1. ReadData2():'System.IO.FileNotFoundException'
  2. WriteData() -> ReadData1():显示来自 a.json 的数据
  3. WriteData() -> ReadData2():creatList()显示来自的数据
  4. WriteData() -> ReadData1():显示来自 a.json 的数据 -> ReadData2():creatList()显示来自的数据

所以,我有一个问题:

  1. 我是否有 2 个 json 文件,一个是我通过添加到我的项目中创建的,另一个是我在运行WriteData()方法时创建的?他们的路径是什么?
  2. 如果我的文件data.jsonDataSource文件夹中,我该如何向其中写入数据?我可以使用 uri 从它读取数据,GetSimpleTaskAsync()但我不知道如何正确写入它。(我试图将对象转换为字符串以写入但无法再次读取,我想我写错了)

对不起我的长篇文章和我的英语不好:) 非常感谢

4

1 回答 1

1

但我想将数据写入同一个文件,所以我以硬核方式添加数据:

您正在混淆 ms-appx:/// 和 ms-appdata:/// 文件夹(或 ApplicationData.Current.LocalFolder )

ms-appx文件夹是只读的。你不能给它写信。(或者您可以在不通过认证过程的情况下编辑您的应用程序代码)

您编写的文件必须在ms-appdata文件夹中。

于 2014-08-05T13:49:36.510 回答