首页 > 解决方案 > 无法删除和更新 JSON 字符串 C#

问题描述

我正在创建一个询问用户放置数据的应用程序。然后将数据存储到结构化的 JSON 文件中。到目前为止,用户可以输入尽可能多的数据,如果他们决定查看旧数据,我可以在文本框中显示 JSON 的值。我需要让用户能够在需要时删除更新数据。下面是 JSON 字符串的样子。点击此处查看应用界面

[
  {
    "Record": 1,
    "IPaddress": "168.147.8.343",
    "Machinename": "taurus",
    "username": "root",
    "password": "root",
    "sourcefolder": ".../.../.../...",
    "destfolder": ".../.../.../...",
    "filextension": "db",
    "removedownloaded": 0
  },
  {
    "Record": 2,
    "IPaddress": "178.255.255.1",
    "Machinename": "sami",
    "username": "sami",
    "password": "sami",
    "sourcefolder": "././././.",
    "destfolder": "././././.",
    "filextension": "json",
    "removedownloaded": 0
  },
  {
    "Record": 3,
    "IPaddress": "255.255.255.255",
    "Machinename": "root",
    "username": "taurus",
    "password": "taurus",
    "sourcefolder": "............/............./",
    "destfolder": "............/............./",
    "filextension": "txt",
    "removedownloaded": 0
  },
  {
    "Record": 4,
    "IPaddress": "168.147.8.343",
    "Machinename": "taurus",
    "username": "root",
    "password": "root",
    "sourcefolder": ".../.../.../...",
    "destfolder": ".../.../.../...",
    "filextension": "db",
    "removedownloaded": 0
  },
  {
    "Record": 5,
    "IPaddress": "168.147.8.343",
    "Machinename": "taurus",
    "username": "root",
    "password": "root",
    "sourcefolder": ".../.../.../...",
    "destfolder": ".../.../.../...",
    "filextension": "db",
    "removedownloaded": 0
  },
  {
    "Record": 6,
    "IPaddress": "168.147.8.343",
    "Machinename": "taurus",
    "username": "root",
    "password": "root",
    "sourcefolder": ".../.../.../...",
    "destfolder": ".../.../.../...",
    "filextension": "db",
    "removedownloaded": 0
  }
]

这就是我所做的,以允许用户在每次输入新数据时创建一个新的 JSON 文件。

private void button4_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("Are you sure you want to Add", "ADD", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {

        filePath = @"C:\Users\Sami\Desktop\Companies\Nautitech Mining Systems Pty Ltd\Code\JSON\app-db.json";
        // Update json data string
        //jsonData = JsonConvert.SerializeObject(DataloggerList);
        //System.IO.File.WriteAllText(filePath, jsonData);
        string text = File.ReadAllText(filePath);

        var currentList = JsonConvert.DeserializeObject<List<Datalogger>>(text);

        //Create new Datalogger

        Datalogger myself = new Datalogger

        {

            Record = ++count,
            IPaddress = textBox2.Text,
            Machinename = textBox8.Text,
            username = textBox4.Text,
            password = textBox3.Text,
            sourcefolder = textBox7.Text,
            destfolder = textBox6.Text,
            filextension = textBox5.Text,

        };

        if (currentList != null && currentList.Any())
        {
            var lastRecordNumner = currentList.OrderBy(q => q.Record).Last().Record;
            myself.Record = lastRecordNumner + 1;

        }
        else
        {
            currentList = new List<Datalogger>();
        }

        currentList.Add(myself);


        string output = Newtonsoft.Json.JsonConvert.SerializeObject(currentList, Newtonsoft.Json.Formatting.Indented);
        Console.WriteLine(output);
        File.WriteAllText(filePath, output);
    }
    else
    {
        this.Activate();
    }


}

当用户单击FirstLastForwardBackward时,数据将显示在文本框中,我需要用户在需要时更新和保存数据。我已经尝试过了,但我没有工作:

private void button1_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("Are you sure you want to Save", "SAVE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {
        Datalogger myself = new Datalogger
        {
            Record = ++count,
            IPaddress = textBox2.Text,
            Machinename = textBox8.Text,
            username = textBox4.Text,
            password = textBox3.Text,
            sourcefolder = textBox7.Text,
            destfolder = textBox6.Text,
            filextension = textBox5.Text,

        };
        filePath = @"C:\Users\Sami\Desktop\Companies\Nautitech Mining Systems Pty Ltd\Code\JSON\app-db.json";
        // Serialize it.

        string serializedJson = JsonConvert.SerializeObject(myself);
        // Print on the screen.  
        Console.WriteLine(serializedJson);
        string output = Newtonsoft.Json.JsonConvert.SerializeObject(myself, Newtonsoft.Json.Formatting.Indented);

        File.WriteAllText(filePath, output);
    }
    else
    {
        this.Activate();
    }

}

有什么想法吗?

标签: c#jsonwinforms

解决方案


作为上述评论的一个例子:

请注意,要使其正常工作,每次更改文本框显示的数据时,您都需要将 Record 字段的文本框设置为 DataLogger 类中的 Record 值- 不要尝试自己计算,始终使用存在的值在 DataLogger 实例中。添加元素时,始终使用 List 全局实例中的 Count 方法计算下一个值

首先,确保有一个类级别的变量来保存您的列表

public class FormForDataLogger : Form
{
     private List<DataLogger> currentData = null;

     // also keep this in one place (but is better if you read it from the config file
     private string filePath = @"C:\Users\Sami\Desktop\Companies\Nautitech Mining Systems Pty Ltd\Code\JSON\app-db.json";

     .....

现在在 Form 构造函数中从文件中加载这些数据

 public FormForDataLogger()
 {
    if(File.Exists(filePath))
    {
        string text = File.ReadAllText(filePath);
        currentData = JsonConvert.DeserializeObject<List<Datalogger>>(text);
    }
    else
        currentData = new List<DataLogger>();
 }

现在,当您要添加数据时

 private void btnAdd_Click(object sender, EventArgs e)
 {
    Datalogger myself = new Datalogger
    {
        Record = currentData.Count + 1;
        IPaddress = textBox2.Text,
        Machinename = textBox8.Text,
        username = textBox4.Text,
        password = textBox3.Text,
        sourcefolder = textBox7.Text,
        destfolder = textBox6.Text,
        filextension = textBox5.Text,
    };
    currentData.Add(myself);

    string output = Newtonsoft.Json.JsonConvert.SerializeObject(currentData, Newtonsoft.Json.Formatting.Indented);
    File.WriteAllText(filePath, output);
}

当你想更新数据时

 private void btnModify_Click(object sender, EventArgs e)
 {
     int record = Convert.ToInt32(txtRecord.Text);
     DataLogger logger = currentData.FirstOrDefault(x => x.Record == record);
     if(logger != null)
     {
         // update logger with your textboxes data
         logger.IPaddress = textBox2.Text;
         logger.Machinename = textBox8.Text;
         logger.username = textBox4.Text;
         logger.password = textBox3.Text;
         logger.sourcefolder = textBox7.Text;
         logger.destfolder = textBox6.Text;
         logger.filextension = textBox5.Text;

         // Save everything
         string output = Newtonsoft.Json.JsonConvert.SerializeObject(currentData, Newtonsoft.Json.Formatting.Indented);
         File.WriteAllText(filePath, output);

     }
}

删除类似

当你想更新数据时

 private void btnDelete_Click(object sender, EventArgs e)
 {
     int record = Convert.ToInt32(txtRecord.Text);
     DataLogger logger = currentData.FirstOrDefault(x => x.Record == record);
     if(logger != null)
     {
         currentData.Remove(logger);
         // Save everything
         string output = Newtonsoft.Json.JsonConvert.SerializeObject(currentData, Newtonsoft.Json.Formatting.Indented);
         File.WriteAllText(filePath, output);

     }

推荐阅读