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

前言

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

1、在C#中如何调用Json

在C#中调用Json相关的对象的话,需要引用Newtonsoft.Json的dll,具体操作如下:

使用vs的NuGet管理器下载dll

安装完成以后就能看到在引用中引用了Newtonsoft.Json

然后我们在代码中添加下面两个命名空间如下:

csharp 复制代码
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类型等。

举例如下:

csharp 复制代码
JObject jObject = new JObject();
            jObject.Add("name","100");
            jObject.Add("result", false );


            string j1 = jObject.ToString();
            Console.WriteLine(j1);

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

csharp 复制代码
{
  "name": "100",
  "result": false
}

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

csharp 复制代码
JObject jObject = new JObject();
        jObject["name"] = "100";
        jObject["result"] = false;

2.2 JArray

csharp 复制代码
[
  {
    "name": "100",
    "result": false
  },
  {
    "name2": "200",
    "result2": false
  }
]

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

csharp 复制代码
  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);

输出结果如下:

csharp 复制代码
[
  {
    "name1": "100",
    "result1": false
  },
  {
    "name2": "200",
    "result2": true
  }
]

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

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

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

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

csharp 复制代码
   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);

最终输出结果如下:

csharp 复制代码
{
  "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字符串反序列化为对象。

这里我定义一个类如下:

csharp 复制代码
  public class ResLogin
    {
        public bool isOk { get; set; }
        public string message { get; set; }
    }

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

csharp 复制代码
 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详解

相关推荐
泛凡(Linyongui)11 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
暴走约伯12 小时前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
信息安全失业大专人员14 小时前
每日了解一个智能体-WorkBuddy
开发语言·ai·c#·智能体
呆呆敲代码的小Y15 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
淡海水15 小时前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
椒颜皮皮虾྅19 小时前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda
昂好的day19 小时前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
吃一碗粉只付一碗钱1 天前
12-给SPA友好的401和403响应
c#·状态模式
caimouse1 天前
MonoDevelop 编译用户应用程序时调用的是哪个编译器
c#
will_net2 天前
apollo 站点部署&C#接入
开发语言·c#·apollo