2017-06-02 34 views
-1

好日子,格式的StreamWriter格式無效寫/追加的Json

我怎麼能保存/追加中的JSON數據與StreamWriter的文件中的一個有效的JSON格式?有沒有一種方法來格式化StreamWriter來以有效的JSON格式附加/寫入文件?

像:

`[ 
     { "data1": "data1" }, 
     { "appended data2": "appended data2" }, 
     { "appended data3": "appended data3" }, 
    ]` 

我使用NewtonJson從對象序列化JSON,然後用StreamWriter的保存。

WritableData an_data = new WritableData 
{ 
    Titel = tbTitel.Text, 
    Type = tbType.Text, 
    Episode = tbEps.Text, 
    Score = tbScore.Text, 
    Id = tbID.Text, 
    TitleEng = tbTitelEng.Text, 
    Status = tbStatus.Text, 
    StartDate = tbDateStart.Text, 
    EndDate = tbDateEnd.Text, 
    Image = pbImage.ImageLocation 
}; 

string path = SavePath + "\\AnList"; 

string json = JsonConvert.SerializeObject(an_data, Formatting.Indented); 

TextWriter tw = new StreamWriter(path + listFile, true); 
tw.WriteLine(json); 
tw.Close(); 

而且它被保存如下:

{ "Titel": "Test1", "Type": "Movie", "Episode": "1", "Score": "6.92", "Id": "894", "TitleEng": "Test1", "Status": "Finished Airing", "StartDate": "1989-07-15", "EndDate": "1989-07-15", "Image": "https://myanimelist.cdn-dena.com/images/anime/5/10193.jpg" }{ "Titel": "Test2", "Type": "TV", "Episode": "153", "Score": "8.16", "Id": "223", "TitleEng": "Test2", "Status": "Finished Airing", "StartDate": "1986-02-26", "EndDate": "1989-04-12", "Image": "https://myanimelist.cdn-dena.com/images/anime/9/21055.jpg" }

我無法找到一個方法來正確格式化。

謝謝您的時間。

+0

你爲什麼要這麼做?使用JObject並添加一個屬性,你想要寫整個文件 –

+0

@Jamiec我編輯了代碼,其中包含'an_data'的數據 – idkWhatToDo

+0

@FilipCordas我認爲這將是保存對象爲JSON的最佳方式。我是新來的C#和編程,所以如果有更好的方式,我會使用它 – idkWhatToDo

回答

-2

通過在最後附加文本來保存數據到文件。從什麼魔法開始會有[]到底? :)

爲什麼你不只是創建一個你想保存到文件的對象的數組/列表,然後將其作爲一個整體序列化並將文本保存到文件中?

var list = new List<WritableData>(); 
list.Add(an_data1); 
list.Add(an_data2); 
//... 
list.Add(an_dataN); 

var serialized = JsonConverter.SerializeObject(list); 
// write to the file with 'overwrite' option, i.e. new StreamWriter(path, false/*!!!*/) 

或者另一種方法是文本追加一個接一個像你試圖這樣做。這將需要一些技巧:

  • 創建文本文件作爲[]
  • ,那麼你要保存的對象(同類型其他前述目的的)每一次,你需要:

    • 打開的文件,並刪除最後一個符號]
    • 追加,
    • 追加序列化的對象,你在你的例子做,
    • 追加]

所以每次你就會有這樣一個有效的JSON,是這樣的:

[ 
    {...}, 
    {...}, 
    ... 
    {...} 
] 
+0

這就是我的意思,我想我是一個不好的人提出適當的問題。現在我懂了。謝謝 !! – idkWhatToDo

-3

理想情況下,序列化類(WriteableData)應包含所有要(序列化)的字段。如果沒有,並且您手動追加一些json數據,那麼您將無法反序列化附加數據。如果你真的需要解決這個問題並且不知道Json對象可能包含什麼數據,那麼考慮使用Dictionary來存儲一些未知數據。但我建議強烈鍵入可序列化的json對象類。否則,你只是在努力維護代碼。

-2

你想更多的屬性添加到您的an_data?所以爲這個類添加更多的屬性。

var an_data = new WritableData() { //btw, use camelCase in var names 
    Prop1 = "foo", 
    Prop2 = "bar" 
}; 

或者使用詞典:

var an_data = new WritableData() { 
    AppendableData = new Dictionary<string, object>() 
} 
an_data.AppendableData["foo"] = "bar"; 
an_data.AppendableData["bar"] = "foo"; 
+0

這不是我想要的,但它也是有用的,並將在未來幫助我,謝謝! Preatty很多答案由@pkuderov解答。 – idkWhatToDo