1.前提
有一个QQ机器人的挂机项目,写个dll插件,配置文件由于懒得使用数据库就设置了JSON文件作为配置文件,C#的JSON文件解析还是比较麻烦的,也踩了不少坑
2.安装Newtonsoft.Json
推荐使用Visual Studio自带的NuGet包管理安装就好,装好之后项目里面包含一下以下命名空间
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using System;
3.踩坑过程
json文件的创建
网上不少教程都是推荐使用File.Create(Json_EventPath)这个函数,我在使用之后发现好像不仅无法创建文件,后期去读取这个文件还会提示,改文件被另一个进程占用,所以我使用了File.Create(Json_EventPath)
加文件流的形式来创建文件了,附上代码
string Json_EventPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"config.json");
if (!File.Exists(Json_EventPath))
{
using (FileStream fs = File.Create(Json_EventPath))
{
string newFile = "{[\"A\":\"a\"]}";
JArray array = (JArray)JsonConvert.DeserializeObject(newFile);
var jsonToOutput = JsonConvert.SerializeObject(array, Formatting.Indented);
byte[] info = new UTF8Encoding(true).GetBytes(jsonToOutput);
// add some information to the file.
fs.Write(info, 0, info.Length);
}
}
上面先设置了json文件的存放路径,接着讲string格式的文件转成JArray的格式,在将JArray逆序列化,最后使用文件流写成文件。
json键值对修改和取值
修改json的键值对,这个没什么好说的,先直接上代码
private void change()
{
string josnString = File.ReadAllText(Json_EventPath, Encoding.UTF8);
int index = dataGridView1.CurrentRow.Index;
var jo = JArray.Parse(josnString);
jo[index]["A"] = A.Text;
jo[index]["B"] = B.Text;
jo[index]["C"] = C.Text;
jo[index]["D"] = D.Text;
var jsonToOutput = JsonConvert.SerializeObject(jo, Formatting.Indented);
byte[] info = new UTF8Encoding(true).GetBytes(jsonToOutput);
// add some information to the file.
using (FileStream fs = File.Create(Json_EventPath))
{
fs.Write(info, 0, info.Length);
}
}
和新加文件差不多的操作,由于我是用的dataGridView控件来显示json的数据,所以我先获取了当前在dataGridView控件里面用户的选中行的索引,接着用文件流的形式读取配置文件,然后对读取出来的string格式用JArray去解析,之后就可以选择JArray jo[index][key]
这样的形式对其中需要修改的键值对进行修改了,当然,如果你需要取值,也可以做类似的操作,稍微适当修改一下代码。
json键值对删除
删除键值对和修改取值是基本类似操作,先上代码
private void b_delete()
{
string josnString = File.ReadAllText(Json_EventPath, Encoding.UTF8);
var jo = JArray.Parse(josnString);
int index = dataGridView1.CurrentRow.Index;
jo[index].Remove();
var jsonToOutput = JsonConvert.SerializeObject(jo, Formatting.Indented);
byte[] info = new UTF8Encoding(true).GetBytes(jsonToOutput);
// add some information to the file.
using (FileStream fs = File.Create(Json_EventPath))
{
fs.Write(info, 0, info.Length);
}
}
和上面修改取值部分同理,读取并且转换成JArray形式之后,调用JArray里面的Remove方法直接就可以删除当前键值对,然后就是正常的写文件操作即可。
附加
关于JObject和JArray的理解,如果你json里面是单一的键值对,就可以使用JObject来解析,如果像我一样里面是个json数组的话,就需要使用JArray来解析操作了。
关于例程,有时间我上传放上来。
6 comments
真好呢
兄弟写的非常好 https://www.cscnn.com/
想想你的文章写的特别好https://www.ea55.com/
怎么收藏这篇文章?
看的我热血沸腾啊https://www.jiwenlaw.com/
博主真是太厉害了!!!