美好的一天,
如何以有效的JSON格式将JSON数据保存/追加到带有StreamWriter的文件中?有没有办法格式化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 :(得分:-1)
通过在末尾附加文本将数据保存到文件中。从什么魔法开始,[
和最后]
? :)
为什么不直接创建要保存到文件的对象数组/列表,然后将其作为一个整体序列化并将文本保存到文件中?
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,看起来像这样:
[
{...},
{...},
...
{...}
]
答案 1 :(得分:-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";
答案 2 :(得分:-3)
理想情况下,序列化类(WriteableData)应包含要(de)序列化的所有字段。如果它没有并且您手动附加一些json数据,那么您将无法反序列化该附加数据。如果你真的需要解决这个问题,并且不知道Json对象可能包含哪些数据,那么可以考虑使用Dictionary来存储一些未知数据。但我建议强烈键入可序列化的json对象类。否则,您只是在努力维护代码。