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

news2024/11/19 3:18:16

目录

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}");
            }
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何通过待办工具提升个人效率 减轻压力提升效率的待办app

在快节奏的现代社会中&#xff0c;工作任务繁重&#xff0c;人们的压力日益增大。为了减轻压力并提升工作效率&#xff0c;我们急需找到一种有效的方法来管理日常任务。幸运的是&#xff0c;随着科技的进步&#xff0c;各种新兴工具应运而生&#xff0c;为我们提供了便捷的解决…

企业内部运营常用的API服务有哪些?

企业内部运营常用的API服务是现代企业管理和协作的关键工具之一。这些API服务提供了丰富的功能和工具&#xff0c;帮助企业提高内部运营效率、优化业务流程和加强团队协作。首先&#xff0c;企业内部通信和协作API服务是不可或缺的。通过这些API服务&#xff0c;企业可以建立内…

LSH算法:高效相似性搜索的原理与Python实现II

局部敏感哈希&#xff08;LSH&#xff09;是一种高效的近似相似性搜索技术&#xff0c;广泛应用于需要处理大规模数据集的场景。在当今数据驱动的世界中&#xff0c;高效的相似性搜索算法对于维持业务运营至关重要&#xff0c;它们是许多顶尖公司技术堆栈的核心。 相似性搜索面…

基于ADRC自抗扰算法的UAV飞行姿态控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 控制系统概述 4.2 ADRC基本框架 4.3 控制律设计 5.完整工程文件 1.课题概述 基于ADRC自抗扰算法的UAV飞行姿态控制系统simulink建模与仿真&#xff0c;分别对YAW&#xff0c;PITCH&#xff0c;ROL…

WEB与低代码:B/S架构在开发中的应用与优势

在互联网迅猛发展的今天&#xff0c;WEB应用已经成为人们日常生活和工作中不可或缺的一部分。随着技术的进步和需求的多样化&#xff0c;开发高效、灵活且易于维护的WEB应用变得尤为重要。B/S架构&#xff08;Browser/Server Architecture&#xff09;作为一种常见的WEB应用架构…

入门JavaWeb之 Response 下载文件

web 服务器接收到客户端的 http 请求 针对这个请求&#xff0c;分别创建一个代表请求的 HttpServletRequest 对象&#xff0c;代表响应的 HttpServletResponse 对象 获取客户端请求过来的参数&#xff1a;HttpServletRequest 给客户端响应一些信息&#xff1a;HttpServletRe…

vue2的待办事项案例

头部组件 <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认" keyup.enter"add"/></div> </template><script>import {nanoid} fro…

【Java Web】过滤器

目录 一、过滤器概述 二、过滤器使用 2.1 注解方式配置过滤器 三、过滤器生命周期 四、过滤器链及其执行顺序 一、过滤器概述 过滤器应用在服务器上类似于防火墙&#xff0c;用户的请求和响应报文在转化为HttpServletRequest和HttpServletResponse对象后&#xff0c;都会先经过…

LongRAG:利用长上下文大语言模型提升检索生成效果

一、前言 前面我们已经介绍了多种检索增强生成 (RAG) 技术&#xff0c;基本上在保证数据质量的前提下&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术能够有效提高检索效率和质量&#xff0c;相对于大模型微调技术&#xff0c;其最大的短板还是在于有限的上下文窗口…

【科学计算与可视化】3. Matplotlib 绘图基础

安装 pip install matplotlib 官方文档 https://matplotlib.org/stable/api/pyplot_summary.html 主要介绍一些图片绘制的简要使用&#xff0c;更加详细和进阶需要可参考 以上官方文档。 1 绘制基础 方法名说明title()设置图表的名称xlabel()设置 x 轴名称ylabel()设置 y 轴…

基于DeepNLP AI Store真人点评和ShowCase分享社区-AI for Image Generator

来源 quora 社区: https://deepnlpaistore.quora.com/ github: https://rockingdingo.github.io/deepnlp/store/image_generator 内容 DeepNLP AI Store 网址&#xff1a;http://www.deepnlp.org/store/image-generator 网站针对图像生成类别 Image Generator下多个AI工具如 …

汽车免拆诊断案例 | 2016 款吉利帝豪EV车无法加速

故障现象 一辆2016款吉利帝豪EV车&#xff0c;累计行驶里程约为28.4万km&#xff0c;车主反映车辆无法加速。 故障诊断 接车后路试&#xff0c;行驶约1 km&#xff0c;踩下加速踏板&#xff0c;无法加速&#xff0c;车速为20 km/h左右&#xff0c;同时组合仪表上的电机及控制…

告别数据线!轻松实现iOS和安卓设备间的文件共享

用 AirDroid 的附近传输功能&#xff0c;完全免费&#xff0c;几十个G的文件也可以相互传输。不限制iPhone和iPad数量&#xff0c;多个设备同时登录也不会强迫下线。 当你要在苹果手机和安卓手机之间传输文件&#xff0c;请将AirDroid安装到两台手机上&#xff0c;然后登录同一…

ce学习第一天(例行性工作,chrony服务时间同步,两台服务器免密登录)

1、Linux 的例行性工作 1.1单一执行的例行性工作 at 单一执行的例行性工作&#xff1a;单一执行的例行性工作&#xff1a;仅处理执行一次就结束了&#xff0c;at -> atd 1.1.1 at 命令的实际工作过程 1、我们使用 at 命令来生成所要运行的工作&#xff0c;并将这个工作&a…

【项目实训】falsk后端连接数据库以及与前端vue进行通信

falsk连接数据库 我们整个项目采用vueflaskmysql的框架&#xff0c;之前已经搭建好了mysql数据库&#xff0c;现在要做的是使用flask连接到数据库并测试 安装flask 首先安装flask pip install flask 进行数据库连接 数据库连接需要使用到pymysql库以及flask库 连接数据库…

Unity之Hololens2开发MRTK Profile详解

前言 配置 MRTK 的主要方式之一是使用基础包中的配置文件。 场景中的主要 MixedRealityToolkit 对象具有活动配置文件 - 一个 ScriptableObject。 顶级 MRTK 配置配置文件包含主核心系统的每个核心的子配置文件数据,每个主核心系统都旨在配置其相应子系统的行为。 此外,这些…

最新自助下单彩虹云商城系统源码,含小储云商城模板免授权

最新彩虹商城源码,含小储云商城模板免授权&#xff0c;试用了一下还行&#xff0c;具体的大家可以看看 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89405387 更多资源下载&#xff1a;关注我。

JavaWeb——MySQL数据库:约束

目录 1. 约束 1.1 概念&#xff1a; 1.2 分类&#xff1a; 1.3 使用&#xff1a; 1.4 外键约束; 1.5 总结 数据库&#xff1a;数据库都有约束&#xff0c;数据库设计&#xff0c;多表查询&#xff0c;事物这四方面的知识&#xff1b; 我们先按这个顺序进行学习&#xff…

如何以智能方式安装 Python

Python易于使用&#xff0c;对初学者友好&#xff0c;功能强大&#xff0c;几乎可以为任何应用程序创建强大的软件。 但与任何其他软件一样&#xff0c;Python 的设置和管理可能很复杂。 在本文中&#xff0c;我们将介绍如何正确设置 Python。 您将学习如何选择合适的版本、…

NISP国家信息安全水平考试

国家信息安全水平考试(NISP)是中国信息安全测评中心考试、发证&#xff0c;由国家网络空间安全人才培养基地运营管理&#xff0c;并授权网安世纪科技有限公司为NISP证书管理中心。 中国信息安全测评中心开展国家信息安全水平考试(NISP)考试项目&#xff0c;是为普及信息安全/网…