.NET根据类的值进行序列化反序列化操作

news/2024/2/21 3:32:54

前言:

在.NET种,序列化一般常用的方式是使用Newtonsoft.Json进行序列化和反序列化操作,比如创建一个Person类

public class Person
{public string Name { get; set; }public int Age { get; set; }
}

序列化为json

// 对象序列化为 JSONPerson person = new Person { Name = "张三李四", Age = 25 };string json = JsonConvert.SerializeObject(person);Console.WriteLine(json);

得到的json如下 

{"Name":"Alice","Age":25}

反序列化

Person deserializedPerson = JsonConvert.DeserializeObject<Person>(json);

以上方法是我们经常用的方法,但是现实中总有奇葩(跟我一起读:sha bi)的需求,以上序列化方式,是将Person的name序列化为json的key(name),将值序列化为json的值(Alice),但是如果有奇葩的需求,是反过来的,我们应该如何处理?

 怎么处理?能怎么处理?还不得找办法解决


 


正文

创建一个公用的类,用于构造数据

public class JsonData
{public PublishSubscribJsonData() {JsonDatas= new List<JsonData>();}public string MQTTName { get; set; }public JsonDataTypeAttData{ get; set; }public List<JsonData>  JsonDatas{ get; set; }
}
public enum AttributeDataType
{Int,String,Boolean,Array,Object}

序列化

private static string ModelListToJson(List<JsonData> data){StringBuilder sb = new StringBuilder();sb.Append("{");int index = 0;foreach (var item in data){if (index > 0){sb.Append(",");}switch (item.AttData ){case JsonDataType.Int:sb.Append($"\"{item.Name }\":0");break;case JsonDataType.String:sb.Append($"\"{item.Name}\":\"\"");break;case JsonDataType.Boolean:sb.Append($"\"{item.Name}\":\"false\"");break;case JsonDataType.Array:sb.Append($"\"{item.Name}\":");sb.Append("[");//这里数据特殊,需要额外处理int indexArr = 0;//判断是否为objectbool obj = false;if (item.JsonDatas .Count==1){if (item.JsonDatas.FirstOrDefault().AttData == JsonDataType.Object){obj = true;foreach (var itemArr in item.JsonDatas){if (indexArr > 0){sb.Append(",");}//sb.Append($"\"{itemArr.Name}\":");sb.Append(ModelListToJson(itemArr.JsonDatas));indexArr++;}}}if (!obj){sb.Append(ModelListToJson(item.JsonDatas));}sb.Append("]");break;case JsonDataType.Object:sb.Append($"\"{item.Name}\":");sb.Append(ModelListToJson(item.JsonDatas));break;default:break;}index++;}sb.Append("}");return sb.ToString();}

反序列化

JObject data = JObject.Parse(jsonCionfig);foreach (var property in data.Properties()){ConfigPublishVariableInfo configPublishVariableInfo = ConfigPublishVariableInfo.CreateAsChild();configPublishVariableInfo.Id = Guid.NewGuid();configPublishVariableInfo.MQTTName = property.Name;configPublishVariableInfo.ConnId = ConnId;ConfigPublishVariableInfo configPublishVariable = GetConfigPublishVariable(Model.ConfigPublishVariableData, configPublishVariableInfo.MQTTName);if (CombinationTypes.Any()){configPublishVariableInfo.BinationTypeId = CombinationTypes.FirstOrDefault().Id;}JToken jToken = property.Value;switch (jToken.Type){case JTokenType.None:case JTokenType.Property:case JTokenType.Constructor:case JTokenType.String:case JTokenType.TimeSpan:case JTokenType.Uri:case JTokenType.Guid:case JTokenType.Null:case JTokenType.Undefined:case JTokenType.Date:case JTokenType.Raw:case JTokenType.Bytes:configPublishVariableInfo.AttributeData = AttributeDataType.String;configPublishVariableInfo.DefaultValue = "";break;case JTokenType.Object:configPublishVariableInfo.AttributeData = AttributeDataType.Object;JObject objData = JObject.Parse(jToken.ToString());ParseJObject(objData, configPublishVariableInfo);break;case JTokenType.Array:configPublishVariableInfo.AttributeData = AttributeDataType.Array;if (configPublishVariableInfo.ConfigPublishArrarData == null || configPublishVariableInfo.ConfigPublishArrarData.Count < 0){configPublishVariableInfo.ConfigPublishArrarData = new ObservableCollection<ConfigPublishVariableInfo>();}//添加一个ObjectConfigPublishVariableInfo ObjectInfo = ConfigPublishVariableInfo.CreateAsChild();ObjectInfo.Id = Guid.NewGuid();ObjectInfo.ConnId = ConnId;if (CombinationTypes.Any()){ObjectInfo.BinationTypeId = CombinationTypes.FirstOrDefault().Id;}ObjectInfo.MQTTName = configPublishVariableInfo.MQTTName + $"_{0}";ObjectInfo.AttributeData = AttributeDataType.Object;ObjectInfo.ConfigPublishArrarData = new ObservableCollection<ConfigPublishVariableInfo>();for (int i = 0; i < jToken.Children().Count(); i++){JObject objDatas = JObject.Parse(jToken[i].ToString());ParseJObject(objDatas, ObjectInfo);}configPublishVariableInfo.ConfigPublishArrarData.Add(ObjectInfo);break;case JTokenType.Comment:break;case JTokenType.Integer:configPublishVariableInfo.AttributeData = AttributeDataType.Int;configPublishVariableInfo.DefaultValue = "0";break;case JTokenType.Float:configPublishVariableInfo.AttributeData = AttributeDataType.Float;configPublishVariableInfo.DefaultValue = "0.1";break;case JTokenType.Boolean:configPublishVariableInfo.AttributeData = AttributeDataType.Boolean;configPublishVariableInfo.DefaultValue = false.ToString();break;default:break;}ConfigPublishVariableData.Add(configPublishVariableInfo);}


http://www.ppmy.cn/news/1026500.html

相关文章

[数据集][目标检测]PCB板缺陷目标检测数据集VOC格式693张6类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;693 标注数量(xml文件个数)&#xff1a;693 标注类别数&#xff1a;6 标注类别名称:["missing_hole",…

【博客698】为什么当linux作为router使用时,安装docker后流量转发失败

为什么当linux作为router使用时&#xff0c;安装docker后流量转发失败 场景 当一台linux机器作为其它服务器的router&#xff0c;负责转发流量的时候&#xff0c;让你在linux上安装docker之后&#xff0c;就会出现流量都被drop掉了 原因 没装docker之前&#xff1a; [root~]…

SQL | 检索数据

1-检索数据 1.1-检索单个列 SELECT prod_name FROM Products; 上述SELECT语句从Products表中检索一个名为prod_name的列。 所要查找的列在select后面&#xff0c;from关键字指出从那个表查询数据。 输出如下&#xff1a; prod_name8 inch teddy bear12 inch teddy bear18…

C++ 虚析构函数

在C中&#xff0c;不能声明虚构造函数&#xff0c;但是可以声明虚析构函数。 析构函数没有类型&#xff0c;也没有参数&#xff0c;和普通成员函数相比&#xff0c;虚析构函数情况很简单。 虚析构函数的声明语法&#xff1a; virtual ~类名();如果一个类的析构函数是虚函数&…

搭建 Python 环境 | Python、PyCharm

计算机 计算机能完成的工作&#xff1a; 算术运算逻辑判断数据存储网络通信…更多的更复杂的任务 以下这些都可以称为 “计算机”&#xff1a; 一台计算机主要由以下这几个重要的组件构成 CPU 中央处理器&#xff1a;大脑&#xff0c;算术运算&#xff0c;逻辑判断 存储器&…

【软件测试】UI自动化框架,数据驱动 vs 关键字驱动怎么选

一、UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程。以下是我之前写的一个自动化测试的小Demo。这个Demo基于Selenium与Java。 自动化测试小Demo 它要测试的东西其实是要看一下百度搜索能不能返回兴业银行的官网。我们分析一下这段代码都包含些…

FFmpeg常见命令行(五):FFmpeg滤镜使用

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

git 给仓库添加新分支并上传代码,git 克隆指定分支

git 克隆指定分支 git clone -b 分支名 仓库地址 例如&#xff1a; git clone -b dev https://gitee.com/UserGuan/spring-boot-demo.git git 给仓库添加新分支并上传代码 1、初始化仓库 git init 2、创建分支并命名 git checkout -b 分支名 例如&#xff1a; git che…

SQL-每日一题【1484. 按日期分组销售产品】

题目 表 Activities&#xff1a; 编写解决方案找出每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。 结果表结果格式如下例所示。 示例 1: 解题思路 前置知识 group_concat函数的功能   将group by产生的…

自动化测试:你根本不懂自动化测试的快乐

接触了不少同行&#xff0c;由于他们之前一直做手工测试&#xff0c;现在很迫切希望做自动化测试&#xff0c;其中不乏工作5年以上的人。 本人从事软件自动化测试已经近6年&#xff0c;从server端到web端&#xff0c;从API到mobile&#xff0c;切身体会到自动化带来的好处与痛楚…

2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯

2023河南萌新联赛第&#xff08;五&#xff09;场&#xff1a;郑州轻工业大学-F 布鲁特佛斯 https://ac.nowcoder.com/acm/contest/62977/F 文章目录 2023河南萌新联赛第&#xff08;五&#xff09;场&#xff1a;郑州轻工业大学-F 布鲁特佛斯题意解题思路代码 题意 给定一个…

kafka高吞吐量分享

消息队列kafka基本介绍基本概念整体架构 高吞吐量实现分区分段顺序写磁盘零拷贝技术DMA&#xff08;Direct Memory Access&#xff09;传统传输零拷贝传输 批量发送 消息队列 解耦合 耦合的状态表示当你实现某个功能的时候&#xff0c;是直接接入当前接口&#xff0c;而利用消…

记录一个正则表达式

正则表达式要求如下: 至少 8 个字符&#xff1b; 至少包含一个小写英文字母&#xff1b; 至少包含一个大写英文字母&#xff1b; 至少包含一个数字&#xff1b; 至少包含一个特殊字符&#xff0c;特殊字符为&#xff1a;“!#$%^&*()-” 中的一个&#xff1b; 不包含2个连续…

2023牛客暑期多校训练营7

Beautiful Sequence 贪心&#xff0c;二进制&#xff0c;构造 Cyperation 模拟 &#xff0c;数学 We Love Strings 分块&#xff0c;二进制枚举&#xff0c;二进制容斥dp Writing Books 签到 根据相邻两个异或值B&#xff0c;因为前小于等于后&#xff0c;故从高到低遍历B的每一…

Redis单机,主从,哨兵,集群四大模式

Redis 单机模式 Redis 单机模式是指 Redis 数据库在单个服务器上以独立的、单一的进程运行的模式。在这种模式下&#xff0c;Redis 不涉及数据分片或集群配置&#xff0c;所有的数据和操作都在一个实例中进行。以下是关于 Redis 单机模式的详细介绍&#xff1a; 单一实例&#…

高级进阶多线程——多任务处理、线程状态(生命周期)、三种创建多线程的方式

Java多线程 Java中的多线程是一个同时执行多个线程的进程。线程是一个轻量级的子进程&#xff0c;是最小的处理单元。多进程和多线程都用于实现多任务处理。 但是&#xff0c;一般使用多线程而不是多进程&#xff0c;这是因为线程使用共享内存区域。它们不分配单独的内存区域…

Exploiting Proximity-Aware Tasks for Embodied Social Navigation 论文阅读

论文信息 题目&#xff1a;Exploiting Proximity-Aware Tasks for Embodied Social Navigation 作者&#xff1a;Enrico Cancelli&#xff0c; Tommaso Campari 来源&#xff1a;arXiv 时间&#xff1a;2023 Abstract 学习如何在封闭且空间受限的室内环境中在人类之间导航&a…

JMeter 的并发设置教程

JMeter 是一个功能强大的性能测试工具&#xff0c;可以模拟许多用户同时访问应用程序的情况。在使用 JMeter 进行性能测试时&#xff0c;设置并发是非常重要的。本文将介绍如何在 JMeter 中设置并发和查看报告。 设置并发 并发是在线程组下的线程属性中设置的。 线程数&#…

Java、Android 加密、j解密 编码、压缩、Hash

对称加密&#xff1a; 算法:AES &#xff08;128位&#xff09;/ DES &#xff08;56位&#xff09;....等 加密原理&#xff1a; 原数据--->加密算法(密钥)------>密文 解密原理&#xff1a; 密文---->解密算法(密钥)------>原数据 非对称加密 算法&#…

React三个状态时触发的相应钩子

01.初始化状态。 这个阶段由render&#xff08;&#xff09;函数触发&#xff1b; 1.constructor(); 2.componentWillMount(); 在17版本以后改为UNSAFE_componentWillMount() reason&#xff1a;react为组件异步渲染做准备&#xff1b; 3.render(); 4.componentDidMount(); 这…
最新文章