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

devtools/2024/9/29 5:30:27/

前言

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

1、在C#中如何调用Json

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

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

using mespace">Newtonsoft.Json;
using mespace">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详解


http://www.ppmy.cn/devtools/47097.html

相关文章

LeetCode 7题:整数翻转(原创)

【题目描述】 【原题链接】. - 力扣&#xff08;LeetCode&#xff09; 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数…

一分钟使用Java实现socket消息传递

一、目的 本程序旨在模拟航空器与塔台之间的实时消息传递&#xff0c;展示其在实际航空通讯中的应用。通过使用 Java 的 JFrame 进行图形用户界面&#xff08;GUI&#xff09;的设计&#xff0c;以及 socket 编程实现网络通信&#xff0c;该程序能够提供一个直观的界面来显示航…

celery-redbeat方案(动态定时任务、异步任务)

文章目录 为什么选择 RedBeat&#xff1f;方案坑事项记录 记一次工作上的问题 问题&#xff1a;项目上当前定时任务框架和服务端耦合&#xff0c;容易出现加载定时任务时间很长&#xff0c;影响后端服务启动&#xff0c;容易改动引发定时任务的问题。且能方便的动态的增加或删除…

学单片机前先学什么?

先学c语言和数字电路 这里默认你说的单片机是51单片机&#xff0c;通过你的问题&#xff0c;我猜你的单片机应该还没有入门&#xff0c;如果是入门的话&#xff0c;一般都是从51单片机开始的。刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从…

R语言中的列表list

基础 在R语言中的最常用的向量有两种&#xff1a; 第一种&#xff0c;原子向量 像字符型向量&#xff0c;数值型向量&#xff0c;逻辑型向量这些&#xff0c;它们共有的一个特点是&#xff0c;向量里面的值是同质的。当你用数值型向量时&#xff0c;里面所有值都是数值型的。…

Uniapp与第三方应用数据通讯

首先说明一点&#xff0c;这个只是uniapp代码编写的应用之间相互传递数据&#xff0c;uniapp编写的与其他语言编写的我尚不知道能不能传递。 应用1&#xff1a; plus.runtime.launchApplication({pname: "应用的appid",// extra 中可以自定数据&#xff0c;url和da…

欢乐打地鼠小游戏html源码

这是一款简单的js欢乐打地鼠游戏&#xff0c;挺好玩的&#xff0c;老鼠出来用鼠标点击锤它&#xff0c;击中老鼠获得一积分。 欢乐打地鼠小游戏html源码

GPT-4o:免费且更快的模型

OpenAI GPT-4o 公告 OpenAI 推出了增强版 GPT-4 模型——OpenAI GPT-4o&#xff0c;用于支持 ChatGPT。首席技术官 Mira Murati 表示&#xff0c;更新后的模型速度更快&#xff0c;并在文本、视觉和音频处理方面有了显著提升。GPT-4o 将免费向所有用户开放&#xff0c;付费用户…