2011-12-18 20 views
2

私は高値と低値、遠くて広い値を検索してこの解決策を探し、最後の数週間は自分のソリューションを実装しようとしましたが、何でも既存のJSONファイルに新しいデータを追加する

私は非常にすべてのヘルプに感謝します!

私のように見えるファイル、(file.json)があります。

{ 
    "Expense": { 
    "Name": "OneTel Mobile Bill", 
    "Amount": "39.90", 
    "Due": "28/12/2011", 
    "Recurrence": "1 Months", 
    "Paid": "0", 
    "LastPaid": "01/01/2002" 
    } 
} 

そして、私のアプリでは、私は新しい「費用」を作成したとき、私はこの既存にその新しい費用を追加したいが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); 
+0

ファイルを読んだことはありますか?データをオブジェクトに逆シリアル化しますか? – Oded

+0

私は自分の質問を更新し、ファイルからどのように読んだかを含めています。しかし、それは別の問題です。私は1つの '費用'を読む方法を知っていますが、今は1つのファイル内の複数の費用から値を読み取る方法を知っています。尋ねていただきありがとうございます。 – Jason

答えて

0

あなたはExpenseオブジェクトに直接読み込むことができるので、あなたはList<Expense>に、このようなオブジェクトを追加することができるはず - (直接フォームデータから、またはその他の)リストへExpense対象として、新たなデータを追加します。

この時点で、JSON.NETを使用してList<Expense>を書き出すことができるはずです。リストの作成には注意が必要です。

シリアル化とデシリアライズを容易にするため、項目が1つだけの場合でも、常にList<Expense>を保存することをお勧めします。

+0

ありがとう@Oded。だから私があなたを正しく理解していれば、私はファイルから読み込み、リストに変換し、新しいデータを追加して、それをすべてファイルに再度保存することができます。そのファイルの既存の内容をすべて上書きしますか? – Jason

+0

@ Jason - JSON.NETは 'List 'に直接変換でき、あなたは完全に理解しているはずです。このアプローチの唯一の問題は、ファイルが大きくなるほどパフォーマンスが悪くなることです。 – Oded

+0

ありがとうございます@Oded!当分の間、これは単なる個人的なプロジェクトであり、パフォーマンスの欠如にあまりにも悩まされませんが、アプリケーションが進化するにつれて、私は確かにより適切なアプローチを検討します。 – Jason

0

あなたがシリアライズ、その後、オブジェクトExpenceへのデータをデシリアライズし、あなたのデータを追加しようとすることができますオブジェクト(オブジェクトのリスト)をファイルに追加します。

+0

ありがとうございます@フォスモ、私はそうするために十分な評判を持っていれば、後でupvoteに戻ってきます。 – Jason

+0

@ジェイソンあなたはそれを戻ってきたことはありません:P – Chax

関連する問題