格式化StreamWriter以有效格式写入/附加Json

时间:2017-06-02 14:02:32

标签: c# json

美好的一天,

如何以有效的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" }

我找不到正确格式化的方法。

感谢您的时间。

3 个答案:

答案 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对象类。否则,您只是在努力维护代码。