c# - 无法删除和更新 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();
}
}
当用户单击First、Last、Forward和Backward时,数据将显示在文本框中,我需要用户在需要时更新和保存数据。我已经尝试过了,但我没有工作:
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();
}
}
有什么想法吗?
解决方案
作为上述评论的一个例子:
请注意,要使其正常工作,每次更改文本框显示的数据时,您都需要将 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);
}
推荐阅读
- python - 什么是 d-Left 计数布隆过滤器?
- sql-server - 是否可以将插入插入到不同的表中?
- git - 多分支 Jenkins 和测试策略(CI/CD)
- reactjs - 如何只监视一个反应钩子useState
- azure - Azure Devops 管道的传入 webhook 触发器:“找不到给定 webHookId 的 webhook”
- javascript - 如何隐藏 fcm firebase api 密钥?当我使用 react-native
- r - 你能改变R中TukeyHSD的顺序吗
- jquery - jquery/ajax CORS 请求返回一个 GET
- html - 无法让导航栏折叠以将我的主要内容向下推
- java - 如何实现 micronaut 数据“ForUpdate”方法