• C# 序列化/反序列化——json


    准备工作

    先创建一个实例类型,和一个用于嵌套的子类型:

        /// <summary>
        /// 某个类
        /// </summary>
       public  class SomeModel
        {
            public string Name { get; set; } = "CUIT";
    
            /// <summary>
            /// 子类型 属性
            /// </summary>
            public SubModel SubModel { get; set; } = new SubModel();
    
        }
    
        /// <summary>
        /// 某个子类
        /// </summary>
        public class SubModel
        {
            /// <summary>
            /// 属性1
            /// </summary>
            public int SubType { get; set; } = 37;
    
            public string Name { get; set; } = "DX";
    
        }

    为项目添加引用:System.Runtime.Serialization

     给希望被 序列化的属性 加标记 DataMemberAttribute;并给类加上标记 DataContract。

    生成序列化的方法代码:

                /* 引用命名空间:using System.Runtime.Serialization.Json; using System.IO;    */
    
                SomeModel vSomeModel = new SomeModel();
                vSomeModel.SubModel.SubType = 41;
    
                try
                {
                    DataContractJsonSerializer vSerializer = new DataContractJsonSerializer(typeof(SomeModel));
                    MemoryStream ms = new MemoryStream();
                    vSerializer.WriteObject(ms, vSomeModel);  // 把实例序列化导内存流中
    
                    // 转换成文本内容
                    byte[] bytes = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(bytes, 0, (int)ms.Length);
                    string jsStr = Encoding.UTF8.GetString(bytes);
                    
                    // 写入指定文件D
                    string filePath = @"D:001.json"; // 保存文件名
                    StreamWriter sw = new StreamWriter(filePath);
                    sw.Write(jsStr);
    
                    sw.Flush();
                    sw.Close();
                }
                catch
                { }

    执行结果:

    反序列化的代码 :

                SomeModel vSomeModel = new SomeModel();
    
                // 从文件中读取
                string filePath = @"D:001.json"; // 保存文件名
                StreamReader sr = new StreamReader(filePath);
                string jsStr = sr.ReadToEnd();
                sr.Close();
    
                // 反序列化
                MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(jsStr));
                DataContractJsonSerializer vSerializer = new DataContractJsonSerializer(typeof(SomeModel));
                vSomeModel = (SomeModel)vSerializer.ReadObject(ms);

    执行效果:

    扩展:查找指定节点的值(字符串)

            /// <summary>
            /// 指定关键字查找JSON串中的值
            /// </summary>
            /// <param name="jsStr">原JSON字符串</param>
            /// <param name="jsKey">关键字</param>
            /// <returns></returns>
            public string GetJsonValue(string jsStr, string jsKey)
            {
                string vRet = "";
                if (false == string.IsNullOrEmpty(jsStr)) // 判断是否传入了有效 json字符串
                {
                    jsKey = $""{jsKey.Trim('"')}""; // 统一格式
                    int index_Start = jsStr.IndexOf(jsKey) + jsKey.Length + 1;
                    if (index_Start > jsKey.Length + 1) // 说明找到了关键字
                    {
                        int dkhNum = 0; // 发现大括号
                        int index_Stop = index_Start;
                        for(int i=index_Start; i < jsStr.Length;i++) // 便利查找结束条件
                        {
                            char tempChar = jsStr[i];
                            if ((tempChar == ',' || tempChar == '}') && dkhNum == 0)
                            {
                                index_Stop = i;
                                break;
                            }
    
                            if (tempChar == '{')
                                dkhNum++;
                            else if (tempChar == '}')
                                dkhNum--;
                        }
    
                        vRet = jsStr.Substring(index_Start, (index_Stop - index_Start));
                        vRet = vRet.Trim('"', ' ', '"'); // 在收尾移除 杂项字符。
                    }
                }
                return vRet;
            }

    例如:

  • 相关阅读:
    使用Git遇到的问题及解决方案(初级)
    巧记前端易混淆的英文语法
    编程助手JavaScript学习库-DOM笔记
    编程助手JavaScript学习库-面向对象编程笔记
    JS原始类型:数值的运用技巧
    这题目有毒之干不过codewars的OJ系统(一)
    Javascript运算符进阶指南
    Qt:During startup program exited with code 0xc0000135
    QT 消息处理机制
    Windows环境 和 Linux环境下搭建Qt开发环境
  • 原文地址:https://www.cnblogs.com/CUIT-DX037/p/12102162.html
Copyright © 2020-2023  润新知