准备工作
先创建一个实例类型,和一个用于嵌套的子类型:
/// <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; }
例如: