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来解析操作了。

关于例程,有时间我上传放上来。

Last modification:September 3, 2019
如果觉得我的文章对你有用,请随意赞赏