UWP - 在没有owerwrite数据的情况下写入JSON

时间:2016-11-12 16:33:01

标签: json uwp

我想将数据写入JSON文件,而不是覆盖它们。我正在使用此代码

Item test = new Item("test", 23);

        try
        {
            var Folder = Windows.Storage.ApplicationData.Current.LocalFolder;
            //var file = await Folder.CreateFileAsync("data.json", Windows.Storage.CreationCollisionOption.ReplaceExisting);
            var file = await Folder.GetFileAsync("data.json");
            var data = await file.OpenStreamForWriteAsync();

            using (StreamWriter r = new StreamWriter(data))
            {
                var serelizedfile = JsonConvert.SerializeObject(test);
                r.Write(serelizedfile);
            }
        }
        catch (Exception a)
        {
            throw a;
        }

1 个答案:

答案 0 :(得分:1)

注意到您可能正在使用Json.NET进行序列化和反序列化Json文件。我认为反序列化Json对象更好,你可以对这个列表进行操作,然后将新列表序列化为Json并保存到文件中,而不是直接序列化一个项目并将其写入文件。

例如,我的Json文件是这样的:

[
    {"color":"red","value":"#f00"},
    {"color":"green","value":"#0f0"},
    {"color":"blue","value":"#00f"},
    {"color":"cyan","value":"#0ff"},
    {"color":"magenta","value":"#f0f"},
    {"color":"yellow","value":"#ff0"},
    {"color":"black","value":"#000"}
]

将一个项目添加到此文件的代码:

if (file != null)
{
    using (var streamIn = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        DataReader reader = new DataReader(streamIn);
        await reader.LoadAsync((uint)streamIn.Size);
        var jsonInstring = reader.ReadString((uint)streamIn.Size);
        var JobjList = JsonConvert.DeserializeObject<List<JsonColor>>(jsonInstring);
        reader.Dispose();
        JobjList.Add(new JsonColor() { color = "pink", value = "#c0c" });
        JsonOutstring = JsonConvert.SerializeObject(JobjList);
    }
    using (var streamOut = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        DataWriter writer = new DataWriter(streamOut);
        writer.WriteString(JsonOutstring);
        await writer.StoreAsync();
        writer.DetachStream();
        writer.Dispose();
    }
}
else
{
}

我的班级对象:

public class JsonColor
{
    public string color { get; set; }
    public string value { get; set; }
}

如您所见,我反序列化了Json文件并获取了List<JsonColor>,然后我将一个项new JsonColor() { color = "pink", value = "#c0c" }添加到此列表中,最后序列化了这个新列表并保存。因此,对于您的场景,您可以修改Json文件和我的JsonColor类以满足您的需要。

<强>更新

private string JsonOutstring;

private async void Button_Click(object sender, RoutedEventArgs e)
{
    //create a json file, if the file is exit, then open it.
    var local = Windows.Storage.ApplicationData.Current.LocalFolder;
    var Jsonfile = await local.CreateFileAsync("test.json", Windows.Storage.CreationCollisionOption.OpenIfExists);
    if (Jsonfile != null)
    {
        ReadAndWriteJsonFile(Jsonfile);
    }
    else
    {
    }
}

public async void ReadAndWriteJsonFile(StorageFile file)
{
    using (var streamIn = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        DataReader reader = new DataReader(streamIn);
        await reader.LoadAsync((uint)streamIn.Size);
        var jsonInstring = reader.ReadString((uint)streamIn.Size);
        var JobjList = JsonConvert.DeserializeObject<List<JsonColor>>(jsonInstring);
        reader.Dispose();
        if (JobjList == null)
        {
            JobjList = new List<JsonColor>();
        }
        JobjList.Add(new JsonColor() { color = "pink", value = "#c0c" });
        JsonOutstring = JsonConvert.SerializeObject(JobjList);
    }
    using (var streamOut = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        DataWriter writer = new DataWriter(streamOut);
        writer.WriteString(JsonOutstring);
        await writer.StoreAsync();
        writer.DetachStream();
        writer.Dispose();
    }
}

public class JsonColor
{
    public string color { get; set; }
    public string value { get; set; }
}