本博客是自己记录学习所用。
学习内容
一、了解什么JSON文件
二、如何使用C#读取
一、什么是JSON文件
JSON网站:https://www.json.org/json-en.html
本文参考的是菜鸟教程中的介绍
链接:https://www.runoob.com/json/json-tutorial.html
1、它是啥?
JSON全程为JavaScript Object Notation,一看就知道是Java搞的一个数据格式。官方说法是一种轻量级的数据交换格式。
3、它咋读?
JSON文件可以直接使用记事本读取。
顾名思义,JSON里面包含的都是一些数据,使用不同的数据类型进行保存。
数据在名称/值对中
数据由逗号分隔
大括号 {} 保存对象
中括号 [] 保存数组,数组可以包含多个对象
一些实例
数据很好懂,大括号就很像python语言里面所说的字典。
像这个文件,最开始是个大括号,那么说明是个字典,字典里面有个关键字sites,sites里面有个中括号即数组,数组保存三个字典,每个字典里面有name和url两个名称,分别指的是网站名字和网址。
不同的类型有不同的读取方法
在此之前,有必要解释几个基本概念:
json字符串,就是string,它一定是由双引号包起来的,如"{‘name’:‘jerry’}"。这是一个string,尽管去掉双引号后它就是一个json对象。
json对象,就是以大括号开头的对象,如{“name”:“jerry”}; 而获取name值的方式就是 json.name 或者 json[“name”];
json数组,就是以中括号开头的json对象数组,如[{“name”:“tom”},{“name”:“jerry”}];获取值的方式是 json[0].name 或 json[0][“name”]; //这里取第一个name
4、总结:
感觉JSON就是一个用类似python字典类型进行不断嵌套的一个数据,里面可以包含数值、字符、字符串、数组、字典等等。
二、如何使用C#读取和修改
本次使用的编辑器是VS2022版本。
代码部分:
首先引用库
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
先定义一个跟Json文件一样的类用于存储数据。
public class DATA
{
public string id { get; set; }
public int dev_type { get; set; }
public double mmpx { get; set; }
public int line { get; set; }
}
左上角的按钮内容,输入文件地址。
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog(); //声明打开文件
ofd.Title = "请选择打开的文件";
ofd.Filter = "json文件(*.json)|*.json";
if (ofd.ShowDialog() == DialogResult.OK) //窗体打开成功
{
textBox1.Text = ofd.FileName; //获取或设置用户选定的路径
}
}
查看按钮部分
public void jiexi_click(object sender, EventArgs e)
{
//string json = "[ { 'id':'AAA', 'dev_type':2, 'mmpx':1.2, 'line':0 }, { 'id':'BBB', 'dev_type':3, 'mmpx':2.2, 'line':1 } ]";
//List datas = JsonConvert.DeserializeObject>(json); //用List作为容器装Person数组
//如何使用e.g:datas[0].id
string data = File.ReadAllText(textBox1.Text);
int num = int.Parse(input_num.Text);
List<DATA> parameters = JsonConvert.DeserializeObject<List<DATA>>(data);
value1.Text = parameters[num].id;
value2.Text = parameters[num].dev_type.ToString();
value3.Text = parameters[num].mmpx.ToString();
value4.Text = parameters[num].line.ToString();
}
保存地址按钮
private void save_adress_click(object sender, EventArgs e)
{
FolderBrowserDialog fd = new FolderBrowserDialog();
if (fd.ShowDialog() == DialogResult.OK)
{
aim_location.Text = fd.SelectedPath;//选择地址
aim_location.Text = String.Concat(aim_location.Text, "\\converted.json");
}
}
保存按钮地址
private void Change_cilck(object sender, EventArgs e)
{
string data = File.ReadAllText(textBox1.Text);
int num = int.Parse(input_num.Text);
List<DATA> parameters = JsonConvert.DeserializeObject<List<DATA>>(data);
parameters[num].id = value1.Text;
parameters[num].dev_type = int.Parse(value2.Text);
parameters[num].mmpx = double.Parse(value3.Text);
parameters[num].line = int.Parse(value4.Text);
File.WriteAllText(aim_location.Text, JsonConvert.SerializeObject(parameters));
MessageBox.Show("修改保存完成!");
}
总结:
本次实验由于时间比较仓促,还是有很多部分没有完成,并且完全没有泛化能力。但是能够提供一个大概的结构,经供参考。