zoukankan      html  css  js  c++  java
  • 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;
            }

    例如:

  • 相关阅读:
    笨方法学python中执行argv提示ValueError: not enough values to unpack (expected 4, got 1)
    VMware workstation安装
    Redis bigkey分析
    MySQL drop table 影响及过程
    MySQL 大表硬连接删除
    ES elasticsearch 各种查询
    ES elasticsearch 各种聚合
    ES elasticsearch 聚合统计
    ES elasticsearch 实现 count单字段,分组取前多少位,以地理位置中心进行统计
    MySQL行溢出、varchar最多能存多少字符
  • 原文地址:https://www.cnblogs.com/CUIT-DX037/p/12102162.html
Copyright © 2011-2022 走看看