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

这篇具有很好参考价值的文章主要介绍了.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),但是如果有奇葩的需求,是反过来的,我们应该如何处理?

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

.NET根据类的值进行序列化反序列化操作,开发语言,.net
 


正文

创建一个公用的类,用于构造数据文章来源地址https://www.toymoban.com/news/detail-642869.html

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

到了这里,关于.NET根据类的值进行序列化反序列化操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用nlohmann json库进行序列化与反序列化

    nlohmann源码仓库:https://github.com/nlohmann/json 使用方式:将其nlohmann文件夹加入,包含其头文件json.hpp即可 demo

    2024年02月10日
    浏览(40)
  • Spring Boot 中使用 ObjectMapper 进行 JSON 序列化和反序列化

    在 Java 中,可以使用各种 JSON 序列化和反序列化工具将 Java 对象转换为 JSON 字符串或者将 JSON 字符串转换为 Java 对象。其中,Jackson 库是比较常用的 JSON 序列化和反序列化工具之一,它提供了 ObjectMapper 类,用于将 Java 对象转换为 JSON 字符串,或者将 JSON 字符串转换为 Java 对象

    2024年02月14日
    浏览(44)
  • ASP.NET Core MVC 从入门到精通之序列化

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步

    2024年02月03日
    浏览(48)
  • C++使用boost::serialization进行序列化

    发现一个比较好玩的东西,boost::serialization序列化操作,简单来说感觉像ofstream和ifstream的升级版,Boost.Serialization 库能够将c++项目中的对象转换为一序列的比特(bytes),用来保存和加载还原对象。 在ORBSLAM3保存和加载地图的时候好像就是采用的这种方法,后面需要再深入研究

    2024年02月08日
    浏览(44)
  • 在Unity中使用Protobuf进行序列化

    目录 1.介绍 1.1 什么是Protobuf 1.2 Protobuf和其他数据序列化方案对比 2.下载Protobuf 2.1 方案一 使用VS的Nuget包管理器进行安装(推荐) 2.1.1安装Protobuff包 2.1.2拷贝.dll文件 2.2 方案二 从Github下载并自己生成.dll 2.2.1 下载Probuff 2.2.2 VS打开解决方案 2.2.3 安装.NET SDK 2.2.4 生成.dll文件 3

    2024年04月12日
    浏览(52)
  • Newtonsoft.Json/Json.NET忽略序列化时的意外错误

    在.NET中Newtonsoft.Json(Json.NET)是我们常用来进行Json序列化与反序列化的库。 而在使用中常会遇到反序列化Json时,遇到不规则的Json数据解构而抛出异常。 Newtonsoft.Json 支持序列化和反序列化过程中的错误处理。 允许您捕获错误并选择是处理它并继续序列化,还是让错误冒泡并抛

    2024年03月21日
    浏览(49)
  • Protobuf-net:C#高效序列化工具,助力接口传输与前端解析

      概述: Protobuf-net是C#中高效的二进制序列化工具,以紧凑、跨语言支持和卓越性能著称。通过定义消息类型、序列化和反序列化实现数据传输,并可适用于Web接口。前端可使用protobuf.js库解析Protobuf格式数据。 Protobuf-net(Protocol Buffers)是一种高效的二进制序列化工具,具有

    2024年03月09日
    浏览(40)
  • Redis反序列化--操作java对象

    1.前言: 前段时间完成一个需求,上线之后发现每次发起请求服务器查询数据太慢了,组长便说加个两分钟的缓存。便打算使用reids做缓存,因为这个接口返回的是一个java对象,就遇到了序列化的问题。 针对数据的“序列化和反序列化”,提供了多种策略(RedisSerializer) 默认为

    2023年04月08日
    浏览(43)
  • 细谈使用CodeQL进行反序列化链的挖掘过程

    学习了一下CodeQL的各种使用方式,决定使用CodeQL细谈一下CC链挖掘,通过一步一步的朝着我们既定的目标进行靠近,最终成功的找到了一条鸡肋的二次反序列化的入口 CodeQL本身包含两部分解析引擎+  SDK  。 解析引擎用来解析我们编写的规则,虽然不开源,但是我们可以直接

    2024年02月05日
    浏览(31)
  • OpenCV中reshape()函数详解-改变矩阵的通道数,对矩阵元素进行序列化

    OpenCV中reshape()函数详解-改变矩阵的通道数,对矩阵元素进行序列化 在opencv中reshape函数,既可以改变矩阵的通道数,又可以对矩阵元素进行序列化 1、函数原型 2、示例 初始化一个矩阵,20行30列1通道 3、结论: 由此可见,不管怎么变,都遵循这样一个等式: 变化之前的 row

    2024年01月17日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包