wpf 在 JSON 文件中附加对象的最佳方法?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27148026/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 12:43:59  来源:igfitidea点击:

Best way to append object in JSON file?

c#jsonwpfjson.net

提问by Eyal C

I have a JSON file with Personobjects and I can't find a comfortable way to append more objects.
Example:
[ {"name": "x", "id": "001"} ]
I tried with List<> and serialize/deserialize but it doesn't seems to work.

Edit:
This happens after clicking a button:

我有一个包含Person对象的 JSON 文件,但我找不到一种舒适的方法来附加更多对象。
示例:
[ {"name": "x", "id": "001"} ]
我尝试使用 List<> 和序列化/反序列化,但它似乎不起作用。

编辑:
单击按钮后会发生这种情况:

Person person = new Person();
person.fName = name.Text;
person.id = int.Parse(id.Text);

string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\Project\";

using (StreamReader r = new StreamReader(path + "persons.json")) {
    string json = r.ReadToEnd();
    List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json);
    persons.Add(person);
    string newJson = JsonConvert.SerializeObject(persons);
    File.WriteAllText(path + "persons.json", newJson);
    r.Close();
}

回答by Vsevolod Goloviznin

You get this error because you're trying to write into file which is open for reading.

您收到此错误是因为您试图写入打开以供读取的文件。

To fix this your code needs to close the StreamReaderfirst and then write to the file.

要解决此问题,您的代码需要先关闭StreamReader然后写入文件。

Person person = new Person();
person.fName = name.Text;
person.id = int.Parse(id.Text);

string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\Project\";

using (StreamReader r = new StreamReader(path + "persons.json")) {
    string json = r.ReadToEnd();
    List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json);
    persons.Add(person);
    string newJson = JsonConvert.SerializeObject(persons); 
} 

File.WriteAllText(path + "persons.json", newJson);

Alternatively, Fileclass provides a shortcut for reading files and you code can look like this:

或者,File类提供了读取文件的快捷方式,您的代码可以如下所示:

Person person = new Person();
person.fName = name.Text;
person.id = int.Parse(id.Text);

string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\Project\";

string json = File.ReadAllText("path + "persons.json");
List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json);
persons.Add(person);
string newJson = JsonConvert.SerializeObject(persons);
File.WriteAllText(path + "persons.json", newJson);