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:\0001.json"; // 保存文件名
                StreamWriter sw = new StreamWriter(filePath);
                sw.Write(jsStr);

                sw.Flush();
                sw.Close();
            }
            catch
            { }

执行结果:

 

 

反序列化的代码 :

            SomeModel vSomeModel = new SomeModel();

            // 从文件中读取
            string filePath = @"D:\0001.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;
        }

例如:

 

posted on 2019-12-26 15:10  云梦鸿  阅读(485)  评论(0编辑  收藏  举报