当前位置: 首页 > news >正文

C# MES通信从入门到精通(11)——C#如何使用Json字符串

前言

我们在开发上位机软件的过程中,经常需要和Mes系统进行数据交互,并且最常用的数据格式是Json,本文就是详细介绍Json格式的类型,以及我们在与mes系统进行交互时如何组织Json数据。

1、在C#中如何调用Json

在C#中调用Json相关的对象的话,需要引用Newtonsoft.Json的dll,具体操作如下:
使用vs的NuGet管理器下载dll
在这里插入图片描述

在这里插入图片描述
安装完成以后就能看到在引用中引用了Newtonsoft.Json
在这里插入图片描述
然后我们在代码中添加下面两个命名空间如下:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

添加完成以后就可以访问JObject、JArray了。

2、Json字符串常用格式

2.1 JObject

Json字符串最常用的是JObject格式,格式如下:
{
“name”: “100”,
“result”: false
}
最外层是一个大括号,然后内部是一些键值对(字典类型),对于c#中的字典类型,大家很清楚,一个是key,一个是value,JObject的成员就是字典,并且字典的key是字符串,但是value的值不一定是字符串,可以是bool类型,也可以是int类型等。
举例如下:

JObject jObject = new JObject();jObject.Add("name","100");jObject.Add("result", false );string j1 = jObject.ToString();Console.WriteLine(j1);

在vs的输出窗口输出结果如图:

{"name": "100","result": false
}

对于JObject赋值有多种方式,既可以使用Add方法添加键值对,也可以直接赋值,如下:

JObject jObject = new JObject();jObject["name"] = "100";jObject["result"] = false;

2.2 JArray

[{"name": "100","result": false},{"name2": "200","result2": false}
]

JArray的最外层是一个中括号,然后中间是很多个大括号,这个大括号其实就是JObject,所以对JArray的赋值就是为JArray添加JObject,举例如下:

  JObject jObject1 = new JObject();jObject1["name1"] = "100";jObject1["result1"] = false;JObject jObject2 = new JObject();jObject2["name2"] = "200";jObject2["result2"] = true;JArray jArray = new JArray();jArray.Add(jObject1);jArray.Add(jObject2);string j2 = jArray.ToString();Console.WriteLine(j2);

输出结果如下:

[{"name1": "100","result1": false},{"name2": "200","result2": true}
]

可以看到jArray 这个对象中,被我添加了jObject1 、jObject2 两个对象。

3、如何在Mes通信中使用JSON字符串

3.1 将对象序列化为Json字符串

在这里插入图片描述
上图是一个mes厂家商提供的常用的一个员工登录需要上传的json字符串,可以看到有一个为MessageCode的键、有一个为MessageContent的键,并且MessageContent这个键的值不是一个单纯的值,它的值又有两个成员,一个是EmployeeId,一个是Password,

   Dictionary<string, object> dic_postJObject = new Dictionary<string, object>();dic_postJObject.Add("MessageCode", "1");dic_postJObject.Add("MessageId", "2");Dictionary<string, string> dic_messageContent = new Dictionary<string, string>();dic_messageContent.Add("EmployeeId","3");dic_messageContent.Add("Password", "111111");dic_postJObject.Add("MessageContent", dic_messageContent);string postJObject = string.Empty;postJObject = JsonConvert.SerializeObject(dic_postJObject, Formatting.Indented);Console.WriteLine(postJObject);

最终输出结果如下:

{"MessageCode": "1","MessageId": "2","MessageContent": {"EmployeeId": "3","Password": "111111"}
}

这里要注意的是:
JsonConvert.SerializeObject这个方法中的第二个参数是一个Formatting类型的枚举,这个枚举有两个值,一个是
1)Formatting.Indented
这个方法会将对象生成的Json字符串含有\r\n,这样最后字符串很有层次性
2)Formatting.None
这个方法会将对象生成的Json字符串去掉了回车,空格,换行,最后的字符串全部连接在一起,没有层次性。

3.2 将Json字符串反序列化为对象

我们从Mes系统接收到的数据一般是json字符串,但是我们一般需要从这个Json字符串中提取出某个属性的值
下图是一个典型的mes系统返回的Json字符串的值,我们一般需要自己先定义好这个类的结构,这样才方便我们将Json字符串反序列化为对象。
在这里插入图片描述
这里我定义一个类如下:

  public class ResLogin{public bool isOk { get; set; }public string message { get; set; }}

使用如下代码进行反序列化测试,测试结果如下:

 Dictionary<string, object> dic_postJObject = new Dictionary<string, object>();dic_postJObject.Add("isOk", true);dic_postJObject.Add("message", "2");string postJObject = string.Empty;postJObject = JsonConvert.SerializeObject(dic_postJObject, Formatting.Indented);Console.WriteLine(postJObject);ResLogin reqLogin =    JsonConvert.DeserializeObject<ResLogin>(postJObject);

可以成功将json字符串转化为ResLogin 对象。

总结

对于简单的结构你可以使用JObject和JArray,对于复杂的结构使用 Dictionary<string, object> 自己去组合。
参考文章:JSON详解

相关文章:

C# MES通信从入门到精通(11)——C#如何使用Json字符串

前言 我们在开发上位机软件的过程中&#xff0c;经常需要和Mes系统进行数据交互&#xff0c;并且最常用的数据格式是Json&#xff0c;本文就是详细介绍Json格式的类型&#xff0c;以及我们在与mes系统进行交互时如何组织Json数据。 1、在C#中如何调用Json 在C#中调用Json相关…...

ON DUPLICATE KEY UPDATE 子句

ON DUPLICATE KEY UPDATE 是 MySQL 中的一个 SQL 语句中的子句&#xff0c;主要用于在执行 INSERT 操作时处理可能出现的重复键值冲突。当尝试插入的记录导致唯一索引或主键约束冲突时&#xff08;即试图插入的记录的键值已经存在于表中&#xff09;&#xff0c;此子句会触发一…...

perl use HTTP::Server::Simple 轻量级 http server

cpan -i HTTP::Server::Simple 返回&#xff1a;已是 up to date. 但是我在 D:\Strawberry\perl\site\lib\ 找不到 HTTP\Server 手工安装&#xff1a;下载 HTTP-Server-Simple-0.52.tar.gz 解压 tar zxvf HTTP-Server-Simple-0.52.tar.gz cd D:\perl\HTTP-Server-Simple-…...

【STM32】基于I2C协议的OLED显示(利用U82G库)

【STM32】基于I2C协议的OLED显示(利用U82G库) 文章目录 【STM32】基于I2C协议的OLED显示(利用U82G库)一、实验背景二、U8g2介绍&#xff08;一&#xff09;获取&#xff08;二&#xff09;简介 三、实践&#xff08;一&#xff09;CubexMX配置&#xff08;二&#xff09;U8g2配…...

掌握Python3输入输出:轻松实现用户交互、日志记录与数据处理

Python 是一门简洁且强大的编程语言&#xff0c;广泛应用于各个领域。在 Python 编程中&#xff0c;输入和输出是基本而重要的操作。无论是进行用户交互、记录日志信息&#xff0c;还是将计算结果输出到控制台或文件&#xff0c;掌握这些操作都是编写高效 Python 程序的关键。本…...

用于每个平台的最佳WordPress LMS主题

你已选择在 WordPress 上构建学习管理系统 (LMS)了。恭喜&#xff01; 你甚至可能已经选择了要使用的 LMS 插件&#xff0c;这已经是成功的一半了。 现在是时候弄清楚哪个 WordPress LMS 主题要与你的插件配对。 我将解释 LMS 主题和插件之间的区别&#xff0c;以便你了解要…...

pytorch 加权CE_loss实现(语义分割中的类不平衡使用)

加权CE_loss和BCE_loss稍有不同 1.标签为long类型&#xff0c;BCE标签为float类型 2.当reduction为mean时计算每个像素点的损失的平均&#xff0c;BCE除以像素数得到平均值&#xff0c;CE除以像素对应的权重之和得到平均值。 参数配置torch.nn.CrossEntropyLoss(weightNone,…...

【iOS】UI——关于UIAlertController类(警告对话框)

目录 前言关于UIAlertController具体操作及代码实现总结 前言 在UI的警告对话框的学习中&#xff0c;我们发现UIAlertView在iOS 9中已经被废弃&#xff0c;我们找到UIAlertController来代替UIAlertView实现弹出框的功能&#xff0c;从而有了这篇关于UIAlertController的学习笔记…...

django支持https

测试环境&#xff0c;可以用django自带的证书 安装模块 sudo pip3 install django_sslserver服务端https启动 python3 manage.py runsslserver 127.0.0.1:8001https访问 https://127.0.0.1:8001/quota/api/XXX...

算法题day41(补5.27日卡:动态规划01)

一、动态规划基础知识&#xff1a;在动态规划中每一个状态一定是由上一个状态推导出来的。 动态规划五部曲&#xff1a; 1.确定dp数组 以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 debug方式&#xff1a;打印 二、刷题&#xf…...

【附带源码】机械臂MoveIt2极简教程(四)、第一个入门demo

系列文章目录 【附带源码】机械臂MoveIt2极简教程(一)、moveit2安装 【附带源码】机械臂MoveIt2极简教程(二)、move_group交互 【附带源码】机械臂MoveIt2极简教程(三)、URDF/SRDF介绍 【附带源码】机械臂MoveIt2极简教程(四)、第一个入门demo 目录 系列文章目录1. 创…...

基于蚁群算法的二维路径规划算法(matlab)

微♥关注“电击小子程高兴的MATLAB小屋”获得资料 一、理论基础 1、路径规划算法 路径规划算法是指在有障碍物的工作环境中寻找一条从起点到终点、无碰撞地绕过所有障碍物的运动路径。路径规划算法较多&#xff0c;大体上可分为全局路径规划算法和局部路径规划算法两大类。其…...

政务云参考技术架构

行业优势 总体架构 政务云平台技术框架图&#xff0c;由机房环境、基础设施层、支撑软件层及业务应用层组成&#xff0c;在运维、安全和运营体系的保障下&#xff0c;为政务云使用单位提供统一服务支撑。 功能架构 标准双区隔离 参照国家电子政务规范&#xff0c;打造符合标准的…...

android 13 aosp 预置so库

展讯对应的main.mk配置 device/sprd/qogirn**/ums***/product/***_native/main.mk $(call inherit-product-if-exists, vendor/***/build.mk)vendor/***/build.mk PRODUCT_PACKAGES \libtestvendor///Android.bp cc_prebuilt_library_shared{name:"libtest",srcs:…...

mongo篇---mongoDB Compass连接数据库

mongo篇—mongoDB Compass连接数据库 mongoDB笔记 – 第一条 一、mongoDB Compass连接远程数据库&#xff0c;配置URL。 URL: mongodb://username:passwordhost:port点击connect即可。 注意&#xff1a;host最好使用名称&#xff0c;防止出错连接超时。...

基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真&#xff0c;输出收敛曲线以及三维曲面最高点搜索结果。 2.测试软件版本以及运行结果展示 MATLAB2022A版本…...

前端js解析websocket推送的gzip压缩json的Blob数据

主要依赖插件pako https://www.npmjs.com/package/pako 1、安装 npm install pako 2、使用&#xff0c; pako.inflate(reader.result, {to: "string"}) 解压后的string 对象&#xff0c;需要JSON.parse转成json this.ws.onmessage (evt) > {console.log("…...

【wiki知识库】06.文档管理接口的实现--SpringBoot后端部分

目录 一、&#x1f525;今日目标 二、&#x1f388;SpringBoot部分类的添加 1.调用MybatisGenerator 2.添加DocSaveParam 3.添加DocQueryVo 三、&#x1f686;后端新增接口 3.1添加DocController 3.1.1 /all/{ebokId} 3.1.2 /doc/save 3.1.3 /doc/delete/{idStr} …...

c,c++,go语言字符串的演进

#include <stdio.h> #include <string.h> int main() {char str[] {a,b,c,\0,d,d,d};printf("string:[%s], len:%d \n", str, strlen(str) );return 0; } string:[abc], len:3 c语言只有数组的概念&#xff0c;数组本身没有长度的概念&#xff0c;需…...

vue-cli 快速入门

vue-cli &#xff08;目前向Vite发展&#xff09; 介绍&#xff1a;Vue-cli 是Vue官方提供一个脚手架&#xff0c;用于快速生成一个Vue的项目模板。 Vue-cli提供了如下功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包上线 依赖环境&#xff1a;NodeJ…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...