2014-12-14 3 views
0

Я пытаюсь создать приложение, которое позволит пользователям добавлять новые записи в локальный json-файл. Я могу легко записать запись в файл, но я не могу ее обновить. Вот код, у меня есть на данный момент:Чтение существующего json и добавление новой записи

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() 
    { 

    } 
} 

Теперь, когда приложение загружает до Я вижу строку существующих данных JSON. Так что теперь, поскольку его строка не может работать с ней. Нужно ли мне перемещаться по объекту [parsedData]? Я хотел бы в основном добавить существующие данные в переменную memberList List<FacultyMember>.

+0

это должно помочь вам http://stackoverflow.com/questions/4611031/convert-json-string-to-c-sharp-object – prospector

ответ

2

Прочитать содержимое файла и десериализовать его в memberList. Затем добавьте их и сохраните снова.

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

Пример

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(); 
     } 
    } 
+0

Это верно. Обычно вы не манипулируете самим файлом. Вы загружаете файл в объект, манипулируете объектом, а затем снова сохраняете его в json (обычно перезаписываете/заменяете исходный файл). – heltonbiker

+0

Это делает работу. Мне не нужно было статично, но я мог бы просто так сделать. – jrock2004

0

Пара вещей:

  1. Вы должны десериализации как тип объекта, который вы хотите затем отливали результат (в данном случае массив FacultyMembers.
  2. Когда вы читаете из файла, вы должны окружать его оператором using, поэтому он закрывается.

Вот пример:

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() 
    { 

    } 
} 
Смежные вопросы