0

I am trying to build an app that will allow users to add new entries to a local json file. I can easily write the record to a file but I cannot get it to update it. Here is the code I have at this point:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
...
public partial class frmGvhs : Form
{
    List<FacultyMember> memberList = new List<FacultyMember>();
    String filename = @"C:\Users\John\test.json";

    public frmGvhs()
    {
        InitializeComponent();
    }

    private void btnSave_Click(object sender, EventArgs e)
    {
        FacultyMember member = new FacultyMember();

        member.firstName = txtFirstName.Text;
        member.lastName = txtLastName.Text;
        member.email = txtEmail.Text;
        member.ext = txtExt.Text;
        member.department = cmbDepartments.Text;

        memberList.Add(member);

        String json = JsonConvert.SerializeObject(memberList.ToArray());
        System.IO.File.WriteAllText(filename, json);
    }

    private void frmGvhs_Load(object sender, EventArgs e)
    {
        if (System.IO.File.Exists(filename))
        {
            System.IO.StreamReader re = new System.IO.StreamReader(filename);
            JsonTextReader reader = new JsonTextReader(re);
            JsonSerializer se = new JsonSerializer();
            object parsedData = se.Deserialize(reader);
            String json = JsonConvert.SerializeObject(parsedData);

            Console.Write(json);
        }
    }
}

public class FacultyMember
{
    public String firstName { get; set; }
    public String lastName { get; set; }
    public String email { get; set; }
    public String ext { get; set; }
    public String department { get; set; }

    public FacultyMember()
    {

    }
}

Now when the app loads up I see the string of the existing json data. So now since its a string I cannot work with it. Do I need to loop through the object [parsedData]? I would like to basically add the existing data to the List<FacultyMember> memberList variable.

John Saunders
  • 160,644
  • 26
  • 247
  • 397
jrock2004
  • 3,229
  • 5
  • 40
  • 73

2 Answers2

3

Read file content and deserialize to memberList. Then add them and save again.

memberList = JsonConvert.DeserializeObject<List<FacultyMember>>(System.IO.File.ReadAllText(filename));

Example

class Program
    {
        static List<FacultyMember> memberList = new List<FacultyMember>();
        static String filename = @"C:\test.json";
        static void Main(string[] args)
        {
            Save();
            Load();
        }

        static void AddNew()
        {
            FacultyMember member = new FacultyMember();

            member.firstName = "Test";
            member.lastName = "Test";
            member.email = "test";
            member.ext = "test";
            member.department = "Test";

            memberList.Add(member);

            Save();
        }

        static void Save()
        {
            String json = JsonConvert.SerializeObject(memberList);
            System.IO.File.WriteAllText(filename, json);
        }

        static void Load()
        {
           memberList = JsonConvert.DeserializeObject<List<FacultyMember>>(System.IO.File.ReadAllText(filename));
            AddNew();
            Save();
        }
    }
dotnetstep
  • 17,065
  • 5
  • 54
  • 72
  • That's right. You usually don't manipulate the file itself. You "load" the file into an object, manipulate the object, and then save it to json again (typically overwriting/replacing the original file). – heltonbiker Dec 14 '14 at 01:41
  • This does the job. I did not have to make it static but I might just want to do that anyways. – jrock2004 Dec 14 '14 at 01:55
0

A couple of things:

  1. You need to deserialize as the type of object you want then cast the result (in this case an array of FacultyMembers.
  2. When you read from the file you should surround it with a using statement so it closes.

Here is a sample:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Foo
{
    static String filename = @"C:\test.json";

    public static void Save()
    {
        FacultyMember member = new FacultyMember();

        member.firstName = Guid.NewGuid().ToString();
        member.lastName = "Bar";
        member.email = "Email";
        member.ext = "Ext";
        member.department = "Dept";

        List<FacultyMember> existing = new List<FacultyMember>(); 
        existing.AddRange(Load());

        existing.Add(member);

        String json = JsonConvert.SerializeObject(existing.ToArray());
        System.IO.File.WriteAllText(filename, json);
    }

    public static FacultyMember[] Load()
    {
        if (System.IO.File.Exists(filename))
        {
            using (System.IO.StreamReader re = new System.IO.StreamReader(filename))
            {
                JsonTextReader reader = new JsonTextReader(re);
                JsonSerializer se = new JsonSerializer();
                object obj = se.Deserialize(reader, typeof (FacultyMember[]));
                return (FacultyMember[]) obj;
            }
        }
        return new FacultyMember[0];
    }
}

public class FacultyMember
{
    public String firstName { get; set; }
    public String lastName { get; set; }
    public String email { get; set; }
    public String ext { get; set; }
    public String department { get; set; }

    public FacultyMember()
    {

    }
}
Scott Semyan
  • 187
  • 3