【问题标题】:UWP - writing to JSON without owerwrite dataUWP - 在不覆盖数据的情况下写入 JSON
【发布时间】:2016-11-12 16:33:01
【问题描述】:

我想将数据写入 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;
        }

【问题讨论】:

  • 还有更多代码吗?你只是在扔掉流。
  • 当然,我已经编辑了帖子。
  • 我需要编写对象 Item 的整个实例(它将有更多的属性)。我不认为,这是最好的选择。
  • 恐怕你的问题我不清楚。你到底想做什么?什么是你不想覆盖的“他们”?

标签: json uwp


【解决方案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&lt;JsonColor&gt;,然后我在这个列表中添加了一项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; }
}

【讨论】:

  • 这看起来很不错。但我在那里没有什么问题。就行了,JobjList.Add(new JsonColor() { color = "pink", value = "#c0c" });它向我显示错误:对象引用未设置为对象的实例。我该如何解决这个问题?
  • @Aellopos,您是否像我一样在代码中创建了 JsonColor 类?
  • 是的,我做到了。我创建了一个新项目来测试这段代码。
  • @Aellopos,我不知道你的问题出在哪里,所以我上传了我的演示here,你可以看看。
  • 它也不起作用,但我知道为什么。我使用空 JSON,它向我显示了错误。当我从您的 JSON 文件中放入代码时,它可以工作。所以我必须有这个大括号[]。然后它工作。但我需要将我的 JSON 文件放在我的应用程序的本地文件夹中。那么,当我创建新的 JSON 文件时,如何将这些大括号放在那里?
猜你喜欢
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多