数据交换的桥梁:深入探索JSON序列化和反序列化

目录

JSON序列化

一、查看JSON文件,设置数据模板类

​编辑

二、Newtonsoft.Json下载

三、代码理解 

1.创建BatteryList的实例

2.初始化Batterys属性

3.添加Battery对象到Batterys列表中

4.完整的代码如下

四、运行结果展示

JSON反序列化


序列化是将对象或数据结构转换为可以存储或传输的格式(如JSON字符串)的过程,而反序列化则是将这个格式的数据转换回原始的对象或数据结构的过程。

序列化是由对象转成字符串(如JSON字符串)

反序列化是由字符串(如JSON字符串)封装成对象。

JSON序列化

一、查看JSON文件,设置数据模板类

我初次见到数据模板类时有点生疏,其实就是将JSON文件里面的属性提取出来作为一个类中的属性。

问:所谓的数据模板类就是将JSON里面的属性提取出来,做成一个类对吧,比如说这个电池的属性,提取共同的属性后 生成Battery类

答:是的,你完全正确。数据模板类(也称为数据模型类或DTO - Data Transfer Object)的目的是为了将JSON或其他数据源中的数据映射到C#对象,以便在程序中更方便地处理这些数据。在你的例子中,你从JSON中提取了电池的各个属性(如CodeSupplyTimeSupplyWeight等),并将它们组织成一个名为Battery的类。这样做的好处是,你可以使用这个类来创建电池对象,这些对象可以包含从JSON中解析出来的数据,并且你可以使用C#的所有面向对象编程的特性(如方法、属性、继承等)来操作这些数据。一旦你有了这个Battery类,你就可以进一步定义一个包含Battery对象列表的类(如BatteryList),以便处理多个电池对象。这样,你就可以将整个JSON结构映射到C#的类结构中,使数据处理变得更加简单和直观。

问:这里不是需要一个Battery类吗,那我是右键解决方案添加类,还是右击项目名添加类呢 ?

答:在Visual Studio中,无论是右键点击解决方案(Solution)还是项目名(Project Name)来添加类,最终的效果都是一样的,因为类文件都会被添加到具体的项目中。不过,一般来说,我们更习惯于直接右键点击项目名来添加类,因为这样做可以确保类文件被添加到你想要的工作范围(即具体的项目)内。

以下是添加类的步骤:

  1. 在Visual Studio的“解决方案资源管理器”(Solution Explorer)中,找到你的项目名(通常是一个文件夹图标)。

  2. 右键点击项目名,选择“添加” -> “类”(Add -> Class)。

  3. 在弹出的对话框中,输入类的名称(比如“Battery”),然后点击“添加”(Add)。

现在,你应该会看到一个名为“Battery.cs”的新文件出现在你的项目中,你可以在这个文件中定义你的Battery类。

同样地,如果你想要添加一个包含多个Battery对象的类(比如BatteryList),你可以再次右键点击项目名,选择“添加” -> “类”,然后输入类名“BatteryList”。

在C#中,从C# 8.0开始,引入了可空引用类型(Nullable reference types)的特性,它允许你指定引用类型(如string、类、接口等)是否可以为null。默认情况下,如果不显式指定,引用类型在C# 8.0及更高版本中被视为不可为null(non-nullable),这意味着编译器会假设这些类型的变量在被使用之前已经被赋予了非null的值。

对于string类型,由于它是一个引用类型,你可以在类定义中显式地指定它是否可以为null。如果你想让string属性可以为null,你需要在属性声明后面添加?后缀。

这个是Battery.cs,也就是上面所说的数据模板类 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JSONProject2
{
    public class Battery
    {
        public string Code { get; set; }
        public string SupplyTime { get; set; }
        public double SupplyWeight { get; set; }
        public double FinishWeight { get; set; }
        public double InjectionValue { get; set; }
        public string FinishTime { get; set; }
        public string Result { get; set; }
        public bool IsDone { get; set; }
    }
    public class BatteryList
    {
        public List<Battery> Batterys { get; set; }
    }
}

 

二、Newtonsoft.Json下载

JSON序列化需要用到的Newtonsoft.Json

1.命名空间问题BatteryList 类可能定义在一个与 Program.cs 不同的命名空间中。如果 BatteryList 类定义在 MyNamespace 命名空间中,而 Program.cs 没有使用 using MyNamespace; 指令,那么编译器就找不到 BatteryList 类型。

三、代码理解 

 2.代码理解:var batteryList = new BatteryList { Batterys = new List<Battery> { new Battery { //数据 }, new Battery { //数据 } // 可以继续添加更多Battery对象... } };

答:这是C#中的一个特性,叫做对象初始化器(Object Initializers),它是C# 3.0及以后版本中引入的一种语法糖,用于简化对象的创建和初始化过程。在你的示例中,你正在使用对象初始化器来创建一个BatteryList的实例,并同时初始化它的Batterys属性,该属性是一个Battery对象的列表。

让我们逐步解析这段代码:

1.创建BatteryList的实例

  • var batteryList = new BatteryList { ... };
  • 这里,var关键字让编译器根据右侧的表达式来推断变量的类型。因为右侧是一个BatteryList的实例,所以batteryList的类型就是BatteryList

2.初始化Batterys属性

  • BatteryList类有一个名为Batterys的属性,它是一个List<Battery>类型的对象。你可以使用对象初始化器来直接为这个属性分配一个新的List<Battery>实例,并初始化其中的元素。
  • Batterys = new List<Battery> { // ... }

3.添加Battery对象到Batterys列表中

  •  在List<Battery>的初始化器中,你可以使用多个对象初始化器来创建并初始化多个Battery对象,并将它们添加到列表中。
  • new Battery { // 初始化Battery对象的数据 }, new Battery { // 初始化另一个Battery对象的数据 } // ... 可以继续添加更多Battery对象

4.完整的代码如下

using Newtonsoft.Json;
namespace JSONProject
{
    class Program
    {
        static void Main()
        {
            // 实例化数据对象  
            var batteryList = new BatteryList
            {
                Batterys = new List<Battery>
            {
                new Battery
                {
                    Code = "asdfasdf",
                    SupplyTime = "2022/1/1 00:00:00",
                    SupplyWeight = 1000.0,
                    FinishWeight = 1123.1,
                    InjectionValue = 123.1,
                    FinishTime = "2022/1/1 00:01:00",
                    Result = "OK",
                    IsDone = true
                },
                new Battery
                {
                    Code = "qwerqwer",
                    SupplyTime = "2022/1/1 00:00:01",
                    SupplyWeight = 1000.0,
                    FinishWeight = 0,
                    InjectionValue = 0,
                    FinishTime = null,
                    Result = "生产中",
                    IsDone = false
                }  
                // 可以继续添加更多Battery对象...  
            }
            };

            // 序列化成JSON字符串  
            string json = JsonConvert.SerializeObject(batteryList, Formatting.Indented); // 使用Formatting.Indented可以使输出的JSON格式更易于阅读  

            // 输出JSON字符串到控制台或保存到文件等...  
            Console.WriteLine(json);
            Console.ReadLine();
        }
    }
}

 

四、运行结果展示

JSON反序列化 

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

// ... 之前的类定义(Battery和BatteryList)保持不变 ...  
namespace JSONProject2
{
    class Program
    {
        static void Main()
        {
            // 假设我们有一个JSON字符串  
            string json = @"  
        {  
            ""Batterys"": [  
                {  
                    ""Code"": ""asdfasdf"",  
                    ""SupplyTime"": ""2022/1/1 00:00:00"",  
                    ""SupplyWeight"": 1000.0,  
                    ""FinishWeight"": 1123.1,  
                    ""InjectionValue"": 123.1,  
                    ""FinishTime"": ""2022/1/1 00:01:00"",  
                    ""Result"": ""OK"",  
                    ""IsDone"": true  
                },  
                {  
                    ""Code"": ""qwerqwer"",  
                    ""SupplyTime"": ""2022/1/1 00:00:01"",  
                    ""SupplyWeight"": 1000.0,  
                    ""FinishWeight"": 0,  
                    ""InjectionValue"": 0,  
                    ""FinishTime"": null,  
                    ""Result"": ""生产中"",  
                    ""IsDone"": false  
                }  
            ]  
        }";

            // 反序列化JSON字符串到BatteryList对象  
            BatteryList batteryList = JsonConvert.DeserializeObject<BatteryList>(json);

            // 现在你可以访问batteryList对象及其Batterys属性了  
            foreach (var battery in batteryList.Batterys)
            {
                Console.WriteLine($"Code: {battery.Code}\nSupplyTime: {battery.SupplyTime}\nSupplyWeight: {battery.SupplyWeight}\n FinishWeight: {battery.FinishWeight}\n" +
                    $"InjectionValue: {battery.InjectionValue}\nFinishTime: {battery.FinishTime}\nResult: {battery.Result}\nIsDone: {battery.IsDone}");
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/747925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年生物技术与食品科学国际会议(ICBFS 2024)

2024 International Conference on Biotechnology and Food Science 2024年生物技术与食品科学国际会议 【会议信息】 会议简称&#xff1a;ICBFS 2024 大会地点&#xff1a;中国厦门 会议邮箱&#xff1a;icbfssub-paper.com 审稿结果&#xff1a;投稿后3日左右 提交检索&…

fiddle查看请求耗时 设置超时背景

windows 下&#xff0c;打开 fiddler 时直接用 快捷键&#xff1a;CTRL R 打开 或 从路径&#xff1a;Rules -> Customize Rules… 打开 // 显示每行请求的服务端耗时时间 public static BindUIColumn("TimeTaken/ms", 120)function TimeTaken(oS: Session):Stri…

安卓直装植物大战僵尸杂交版V2.1版完美运行

安卓直装植物大战僵尸杂交版V2.1版完美运行 链接&#xff1a;https://pan.baidu.com/s/1SPFouV8T-AV2LnUoZfy6lQ?pwd3gl6 提取码&#xff1a;3gl6

裸机与操做系统区别(RTOS)

声明&#xff1a;该系列笔记是参考韦东山老师的视频&#xff0c;链接放在最后&#xff01;&#xff01;&#xff01; rtos&#xff1a;这种系统只实现了内核功能&#xff0c;比较简单&#xff0c;在嵌入式开发中&#xff0c;某些情况下我们只需要多任务&#xff0c;而不需要文件…

49-3 内网渗透 - MSI安 装策略提权

靶场环境搭建: 这里还是用我们之前的windows2012虚拟机进行搭建 1)打开一些设置让靶场存在漏洞 打开组策略编辑器(gpedit.msc) 使用运行命令打开: 按下 Win + R 组合键来打开运行对话框。输入 gpedit.msc,然后按下 Enter 键。使用搜索打开: 点击任务栏上的搜索框(W…

简单的text/html无法解析解决记录

简单的text/html无法解析解决记录 1. bug发现 我们所有的服务都是微服务&#xff0c;服务间调用都是使用feign接口进行调用&#xff0c;正常调用都没有问题&#xff0c;但是某一天发现部分从esb服务调用过来到我们本地的服务&#xff0c;本地服务再使用feign接口调用其他微服…

Java洗鞋小程序预约系统源码

&#x1f4a5;洗鞋神器来袭&#xff01;轻松预约&#xff0c;让你的鞋子焕然一新&#x1f45f; &#x1f389; 告别洗鞋烦恼&#xff0c;洗鞋预约小程序来啦&#xff01; 你是不是常常为洗鞋而烦恼&#xff1f;手洗太累&#xff0c;送去洗衣店又贵又麻烦。现在&#xff0c;好…

js计算某个时间距离当前时间多少天,少于7天红色展示

效果图 后端返回数据格式 info:{vip_validity:"2027-09-07" }<div>到期时间&#xff1a;{{ info.vip_validity }}, 剩余<span :class"countdownDays(info.vip_validity) < 7 ? surplus : ">{{ !!info.vip_validity ? countdownDays(inf…

【ARM-Linux篇】项目:智能家居

一、项目概述 •项目功能 通过语音控制客厅灯、卧室灯、风扇、人脸识别开门等,可以进行火灾险情监测,可以并且实现Sockect发送指令远程控制各类家电等 •项目描述 全志H616通过串口连接各模块硬件,检测语音的识别结果,分析语音识别的结果来对家电设备进行控制。摄像头拍…

Superagent:一个开源的AI助手框架与API

在人工智能日益普及的今天,如何将AI助手无缝集成到应用中成为了开发者们关注的焦点。今天,我们要介绍的Superagent正是一个为这一需求量身打造的开源框架与API。它结合了LLM、检索增强生成(RAG)和生成式AI技术,为开发者们提供了一个强大而灵活的解决方案。 一、Superagen…

PID原理及控制算法详解

文章目录 1. 概念 1.1 PID框图 1.2 具体示例&#xff1a;无人机高度控制 2. PID原理 3. 常用术语 4. 计算过程 4.1 比例控制&#xff08;Proportional&#xff09; 4.2 积分控制&#xff08;Integral&#xff09; 4.3 微分控制&#xff08;Derivative&#xff09; 5.…

6.18-6.26 旧c语言

第一章 概述 32关键字 9种控制语句 优点&#xff1a;能直接访问物理地址&#xff0c;位操作&#xff0c;代码质量高&#xff0c;执行效率高 可移植性好 面向过程&#xff1a;以事件为中心 面向对象&#xff1a;以实物为中心 printf&#xff1a;系统定义的标准函数 #include&l…

[图解]建模相关的基础知识-19

1 00:00:00,640 --> 00:00:04,900 前面讲了关系的这些范式 2 00:00:06,370 --> 00:00:11,570 对于我们建模思路来说&#xff0c;有什么样的作用 3 00:00:12,660 --> 00:00:15,230 我们建模的话&#xff0c;可以有两个思路 4 00:00:16,790 --> 00:00:20,600 一个…

《Redis设计与实现》阅读总结-3

第 12 章 事件 Redis服务器是一个事件驱动程序&#xff0c;服务器需要处理两类事件&#xff1a;文件事件和时间事件 一、文件事件 1. 文件处理器&#xff1a;Redis基于Reactor模式开发了自己的网络事件处理器被称为文件处理器 文件事件处理器使用I/O多路复用程序来同时监听多…

electron线上跨域问题

一、配置background.js win new BrowserWindow({webPreferences: {nodeIntegration: true, // 使渲染进程拥有node环境//关闭web权限检查&#xff0c;允许跨域webSecurity: false,// Use pluginOptions.nodeIntegration, leave this alone// See nklayman.github.io/vue-cli-p…

win11系统重装?正版系统Windows11安装重启!保姆级重装系统攻略!

随着科技的不断发展&#xff0c;Windows 11系统已经逐渐成为了众多电脑用户的新选择。然而&#xff0c;当当电脑出现严重故障、受到病毒攻击、软件冲突、系统升级失败、硬件更换或升级、系统性能下降或个性化需求等情况时&#xff0c;重装系统可能是一个有效的解决方案。本文将…

江协科技51单片机学习- p16 矩阵键盘

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

武汉星起航:跨境电商浪潮下,中国卖家扬帆出海,书写国际新篇章

随着全球化进程的加速和互联网技术的飞速发展&#xff0c;跨境出口电商模式已成为中国卖家海外拓展的重要渠道。这一模式不仅为商家带来了巨大的市场机遇&#xff0c;更为中国卖家在全球舞台上展示其独特魅力和竞争力提供了宝贵平台。武汉星起航将从多个维度探讨中国卖家海外发…

基于 GD32F450 的Zephyr 的基本测试-编译工程

一、cmake 编译 hello world 测试 打开示例工程 hello world cd ~/zephyrproject/zephyr/samples/hello_world新建 build 目前&#xff0c;用于存放临时文件目录&#xff0c;并进入该目录 mkdir -p build && cd build通过 cmake 指令 生成 gd32f450z 工程的 makefil…

聚观早报 | 小鹏MONA M03曝光;iPhone 16系列电池改进

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月25日消息 小鹏MONA M03曝光 iPhone 16系列电池改进 一加Ace 3 Pro三款配色 字节跳动与博通合作开发AI芯片 蚂…