Search code examples
c#jsonwpfjson.net

Best way to append object in JSON file?


I have a JSON file with Person objects 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 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();
}

Solution

  • 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 StreamReader first and then write to the file.

    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, File class provides a shortcut for reading files and you code can look like this:

    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);