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

前言:

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

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

序列化为json

// 对象序列化为 JSON
    Person 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;
                        //判断是否为object
                        bool 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>();
                                }
                                //添加一个Object
                                ConfigPublishVariableInfo 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);
                    }

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

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

相关文章

Python-OpenCV中的图像处理-图像平滑

Python-OpenCV中的图像处理-图像平滑 图像平滑平均滤波高斯模糊中值模糊双边滤波 图像平滑 使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。其实就是去除图像中的高频成分&#xff08;比如&#xff1a;噪音&#xff0c;边界&#xff09;。所以边界也会被模糊…

stm32常见数据类型

stm32的数据类型的字节长度 s8 占用1个byte&#xff0c;数据范围 -2^7 到 (2^7-1) s16 占用2个byte&#xff0c;数据范围 -2^15 到 (2^15-1) s32 占用 4个byte&#xff0c;数据范围 -2^31 到 (231-1)231 2147483647 int64_t占用8个byte&#xff0c;数据范围 -2^63 到 (2^63-1)…

【cs61b】学习笔记day2

历史文章目录 【cs61b】学习笔记day1 文章目录 历史文章目录List两个小问题bits声明一个变量引用类型方框和指针表示法数组的实例化链表 SLList List 两个小问题 思考下面两个代码分别输出什么 Walrus a new Walrus(1000, 8.3); Walrus b; b a; b.weight 5; System.out.…

43.字符串相乘

目录 一、题目 二、代码 一、题目 43. 字符串相乘 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public: string addStrings(string num1, string num2)//求两个字符串相加 {int end1 num1.size() - 1;int end2 num2.size() - 1;int next 0;//进位…

windows 10 远程桌面配置

1. 修改远程桌面端口&#xff08;3389&#xff09; 打开注册表&#xff08;winr&#xff09;, 输入regedit 找到配置项【计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd\Tds\tcp】 &#xff0c; 可以通过搜索“Wds”快速定位。 修改端口配…

PHPExcel单独设置(高亮)单元格部分文字字体颜色 导出文件(两种方法)

public function exportData(){ $objPHPExcel new \PHPExcel();//创建一个富文本对象$objRichText new \PHPExcel_RichText();$objRichText->createText(铁扇公主);//需要改变大小或颜色的文字内容$objPayable $objRichText->createTextRun(芭蕉妹妹);//设置加粗$objP…

Python-OpenCV中的图像处理-图像梯度

Python-OpenCV中的图像处理-图像梯度 图像梯度Sobel 算子和 Scharr 算子Laplacian 算子 图像梯度 图像梯度&#xff0c;图像边界等使用到的函数有&#xff1a; cv2.Sobel()&#xff0c; cv2.Scharr()&#xff0c; cv2.Laplacian() 等原理&#xff1a;梯度简单来说就是求导。Op…

[保研/考研机试] 括号匹配问题 C++实现

题目描述&#xff1a; 在某个字符串(长度不超过100)中有左括号、右括号和大小写字母&#xff1b;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序&#xff0c;找到无法匹配的左括号和右括号&#xff0c;输出原来的字符串&am…

MachineLearningWu_14/P65-P69_Multiclass

x.1 Multiclass多分类问题 对于分类问题&#xff0c;往往指的是二分类问题&#xff0c;而对于二分类的decision boundary较为简单&#xff0c;而实际生活中会有很多问题是多分类问题&#xff0c;例如MNIST手写数字识别&#xff0c; 从特征空间上来看&#xff0c;二分类和多分类…

SpringCloud 尚硅谷 微服务简介以及Eureka使用

写在前面 该系列博客仅用于本人学习尚硅谷课程SpringCloud笔记&#xff0c;其中的错误在所难免&#xff0c;如有错误恳请指正。 官方源码地址&#xff1a;https://github.com/zzyybs/atguigu_spirngcloud2020 什么是SpringCloud Spring Cloud是微服务一站式服务解决方案&…

Segment Anything(SAM) 计算过程

给定输入图像 I ∈ R 3 H W I \in R^{3 \times H \times W} I∈R3HW。给定需要的prompts&#xff1a; M ∈ R 1 H W M \in R^{1 \times H \times W} M∈R1HW&#xff0c;代表图片的前背景信息。 P ∈ R N 2 P \in R^{N \times 2} P∈RN2&#xff0c;其中 N N N 是点的个数…

活动发布会邀请媒体6步走

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体参加活动发布会对信息的传播&#xff0c;企业品牌建设有诸多的好处&#xff0c;今天就与大家分享下邀请媒体参加活动报道的6个步骤&#xff1a; 1. 策划与准备&#xff1a; -明…

vue3 - 使用reactive定义响应式数据进行列表赋值时,视图没有更新的解决方案

文章目录 1&#xff0c;问题2&#xff0c;原因3&#xff0c;解决方案一、再封装一层数据&#xff0c;即定义属性名&#xff0c;在后期赋值的时候&#xff0c;对此属性进行直接赋值三、使用数组的splice来直接更改原数组三、使用 ref 来定义数据 1&#xff0c;问题 在Vue 3.0 中…

ThreadLocal

# ThreadLocal # ThreadLocal 有什么用&#xff1f; 通常情况下&#xff0c;我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢&#xff1f; JDK 中自带的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要…

Vue+Vue Router+TailwindCss+Daisyui部署

一、构建Vue项目 > npm init vuelatest > cd <your-project-name> > npm install > npm run dev 二、设置IDEA JS版本 三、安装Tailwindcss Install Tailwind CSS with Vite - Tailwind CSS npm install -D tailwindcss postcss autoprefixer npx tai…

Titanic细节记录一

目录 chunker header index_col names Series与DataFrame的区别 df.columns del和drop的区别 reset_index loc与iloc的区别 不同的排序方式 sort_values sort_index DataFrame相加 describe函数查看数据基本信息 查看多个列的数据时使用列表 处理缺失值的几种思路 …

【Kubernetes】Kubernetes之kubectl详解

kubectl 一、陈述式资源管理1. 陈述式资源管理方法2. 基本信息查看3. 项目周期管理3.1 创建 kubectl create 命令3.2 发布 kubectl expose命令3.3 更新 kubectl set3.4 回滚 kubectl rollout3.5 删除 kubectl delete 4. kubectl 的发布策略4.1 蓝绿发布4.2 红黑发布4.3 灰度发布…

代码随想录算法训练营第24天| 第七章 回溯算法part01 理论基础、leetcode 77

Part I : 回溯算法基础 背景&#xff1a;一直以来都是半懂不懂的&#xff0c;在逻辑上不难&#xff0c;毕竟属于暴力搜索&#xff1b;在代码上就开始缠绕起来了&#xff0c;自己研究的时候对N皇后问题老是理不清。这次终于在Carl这开始前进啦&#xff01;何为回溯算法&#xf…

爬虫012_字典高级操作_查询_修改_添加_删除和清空_遍历---python工作笔记031

然后来看字典高级,首先 打印某个元素 然后打印的时候注意,如果直接打印的值,在字典中没有就报错 这里要注意不能用点访问

Redis类型检查与命令多态

Redis中用于操作键的命令基本上可以分为两种类型。 其中一种命令可以对任何类型的键执行&#xff0c;比如说DEL命令、EXPIRE命令 、RENAME命令、TYPE命令、OBJECT命令等。 举个例子&#xff0c;以下代码就展示了使用DEL命令来删除三种不同类型的键: # 字符串键 redis> SE…