2016-11-12 7 views
0

データを上書きせずにJSONファイルに書きたいと思います。私はこのコードにUWP - owerwriteデータなしで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; 
     } 
+0

は、より多くのコードはありますか?あなたはただストリームを捨てているだけです。 –

+0

もちろん、投稿を編集しました。 – Aellopos

+1

[既存のStorageFileにバイト配列を追加する方法](http://stackoverflow.com/questions/14092488/how-to-append-array-of-bytes-to-the-existed-storagefile)の可能な複製 –

答えて

1

を使用していますが、おそらくシリアル化および逆シリアル化のためのJSONファイルをJson.NETを使用していることに気づきました。私は、Jsonオブジェクトのリストを非直列化する方が良いと思います。このリストを操作し、新しいリストをJsonにシリアル化してファイルに保存し、1つのアイテムを直接シリアル化してファイルに書き込むことはできません。あなたのよう

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

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 
{ 
} 

私のクラスオブジェクト:このファイルに1つの項目を追加するための

[ 
    {"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"} 
] 

コード:たとえば

は、私のJSONファイルは、このようなものです私がJsonファイルをデシリアライズしてList<JsonColor>を取得したら、new JsonColor() { color = "pink", value = "#c0c" }に1つの項目を追加しました最後にこの新しいリストをシリアライズして保存します。あなたのシナリオでは、あなたのニーズに合わせて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; } 
} 
+0

これはとてもよさそうです。しかし、そこにはほとんど問題はありません。この行には、JobjList.Add(new JsonColor(){color = "pink"、value = "#c0c"})があります。それは私にエラーが表示されます:オブジェクト参照がオブジェクトのインスタンスに設定されていません。どうすれば修正できますか? – Aellopos

+0

@Aellopos、私のようにあなたのコードでJsonColorクラスを作成しましたか? –

+0

はい、しました。私はこのコードをテストするための新しいプロジェクトを作成しました。 – Aellopos

関連する問題