『7x24小时有问必答』

C# 上位机 Json 数据导入导出

优先用 Newtonsoft.Json(Json.NET),兼容工控场景多类型、高稳定,直接 NuGet 安装即可适配上位机常用场景:配置文件、采集记录、参数备份,附可直接复用代码

核心基础(通用工具类)

封装通用帮助类,一次封装全程复用,适配 WinForm/WPF
using  Newtonsoft.Json;using  System.IO;///  <summary>///  工控Json持久化工具类(适配上位机数据导入导出)///  </summary>public  static  class  JsonHelper{       // 导出Json(序列化)       public  static  bool  ExportJson<T>(T data,  string  savePath)      {             try            {                   // 格式化缩进+兼容工控特殊类型,避免序列化失败                   var  settings =  new  JsonSerializerSettings                  {                        Formatting = Formatting.Indented,                        NullValueHandling = NullValueHandling.Ignore,                        ReferenceLoopHandling = ReferenceLoopHandling.Ignore//解决工控对象循环引用                  };                   string  jsonStr = JsonConvert.SerializeObject(data, settings);                  File.WriteAllText(savePath, jsonStr, Encoding.UTF8);                   return  true;            }             catch  (Exception ex)            {                   // 上位机可弹窗提示,这里简化返回                  Console.WriteLine($"导出失败:{ex.Message}");                   return  false;            }      }       // 导入Json(反序列化)       public  static  T? ImportJson<t>(string  filePath)      {             try            {                   if  (!File.Exists(filePath))  return  default;                   string  jsonStr = File.ReadAllText(filePath, Encoding.UTF8);                   return  JsonConvert.DeserializeObject<t>(jsonStr);            }             catch  (Exception ex)            {                  Console.WriteLine($"导入失败:{ex.Message}");                   return  default;            }      }}

上位机 2 个高频实战场景(直接套用)

场景 1:上位机配置参数导入导出(最常用)

比如 PLC 连接参数、视觉工位参数、机器人点位参数,序列化实体类即可
先定义工控配置实体(按需加字段)
// 工控上位机核心配置实体public  class  PlcConfig{       public  string  IpAddress {  get;  set; }  // PLC IP       public  int  Port {  get;  set; }            // 端口       public  int  Rack {  get;  set; }            // 机架号       public  int  Slot {  get;  set; }            // 槽位号       public  List<string> MonitorTags {  get;  set; }  // 监控标签       public  int  ScanInterval {  get;  set; }  // 采集间隔(ms)}
调用工具类(WinForm 按钮点击事件直接用)
// 导出配置(比如点击【导出配置】按钮)private  void  BtnExportConfig_Click(object  sender, EventArgs e){       // 1. 组装当前配置(实际从界面控件取值)       var  config =  new  PlcConfig      {            IpAddress =  "192.168.1.10",            Port =  102,            Rack =  0,            Slot =  1,            MonitorTags =  new  List<string>{"DB1.DBW0",  "DB1.DBW2"},            ScanInterval =  200      };       // 2. 选择保存路径(上位机标配SaveFileDialog)       using  (SaveFileDialog sfd =  new  SaveFileDialog())      {            sfd.Filter =  "Json文件|*.json|所有文件|*.*";            sfd.Title =  "导出PLC配置";             if  (sfd.ShowDialog() == DialogResult.OK)            {                   bool  success = JsonHelper.ExportJson(config, sfd.FileName);                  MessageBox.Show(success ?  "导出成功"  :  "导出失败");            }      }}// 导入配置(点击【导入配置】按钮)private  void  BtnImportConfig_Click(object  sender, EventArgs e){       using  (OpenFileDialog ofd =  new  OpenFileDialog())      {            ofd.Filter =  "Json文件|*.json|所有文件|*.*";            ofd.Title =  "导入PLC配置";             if  (ofd.ShowDialog() == DialogResult.OK)            {                  PlcConfig? config = JsonHelper.ImportJson<plcconfig>(ofd.FileName);                   if  (config !=  null)                  {                         // 3. 赋值给界面控件(核心步骤)                        txtIp.Text = config.IpAddress;                        txtPort.Text = config.Port.ToString();                         // ...其他控件赋值                        MessageBox.Show("导入成功");                  }                   else                  {                        MessageBox.Show("导入失败或文件无效");                  }            }      }}

场景 2:工控采集数据批量导入导出

比如生产记录、报警日志、采集数据表,支持 List 集合序列化
定义采集数据实体
// 生产采集记录(工控常用)public  class  CollectData{       public  DateTime CollectTime {  get;  set; }  // 采集时间       public  string  StationNo {  get;  set; }        // 工位号       public  decimal  Value {  get;  set; }            // 采集值       public  bool  IsQualified {  get;  set; }        // 是否合格       public  string? Remark {  get;  set; }           // 备注}
批量导出 / 导入
// 批量导出采集记录private  void  BtnExportCollect_Click(object  sender, EventArgs e){       // 模拟采集数据列表(实际从数据库/内存取)      List<collectdata> dataList =  new  List<collectdata>()      {             new  CollectData{CollectTime=DateTime.Now, StationNo="ST01", Value=12.3m, IsQualified=true},             new  CollectData{CollectTime=DateTime.Now, StationNo="ST02", Value=11.8m, IsQualified=true}      };       using  (SaveFileDialog sfd =  new  SaveFileDialog())      {            sfd.Filter =  "Json文件|*.json|所有文件|*.*";             if  (sfd.ShowDialog() == DialogResult.OK)            {                   bool  success = JsonHelper.ExportJson(dataList, sfd.FileName);                  MessageBox.Show(success ?  "批量导出成功"  :  "批量导出失败");            }      }}// 批量导入采集记录private  void  BtnImportCollect_Click(object  sender, EventArgs e){       using  (OpenFileDialog ofd =  new  OpenFileDialog())      {            ofd.Filter =  "Json文件|*.json|所有文件|*.*";             if  (ofd.ShowDialog() == DialogResult.OK)            {                  List<collectdata>? dataList = JsonHelper.ImportJson<list<collectdata>>(ofd.FileName);                   if  (dataList !=  null  && dataList.Count >  0)                  {                         // 绑定到DataGridView(上位机显示列表标配)                        dgvCollect.DataSource = dataList;                        MessageBox.Show($"导入{dataList.Count}条记录");                  }            }      }}

上位机适配关键注意事项

编码必须用UTF8,避免工控电脑中文乱码。
序列化加ReferenceLoopHandling.Ignore,解决工控对象(如 PLC 客户端)循环引用。
敏感配置(如密码)可先加密再序列化,导出后更安全。
大文件(>100MB,如海量采集记录)建议分块导出,避免内存溢出。
替代方案:若需兼容老系统,可换System.Text.Json(.NET Core 3.0 + 自带,无需 NuGet),只需替换 JsonHelper 内序列化方法。

</list<collectdata></collectdata></collectdata></collectdata></plcconfig></t></t>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码