.NET下解析Json的方法
主要类 | 命名空间 | 限制 | 内建LINQ支持 |
---|---|---|---|
DataContractJsonSerializer | System.Runtime.Serialization.Json | 通用 | 否 |
JavaScriptSerializer | System.Web.Script.Serialization | 只能在Web环境使用 | 否 |
JsonArray、JsonObject、JsonValue | System.Json | 只能在Silverlight中使用 | 是 |
JsonConvert、JArray、JObject、JValue、JProperty | Newtonsoft.Json | 通用 | 是 |
DoNet2.0 需要借助于开源的类库Newtonsoft.Json.dll
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 代码 using System; using System.IO; using System.Text; using Newtonsoft.Json; namespace OfflineAcceptControl.UCTools { public class JsonTools { // 从一个对象信息生成Json串 public static string ObjectToJson( object obj) { return JavaScriptConvert.SerializeObject(obj); } // 从一个Json串生成对象信息 public static object JsonToObject( string jsonString, object obj) { return JavaScriptConvert.DeserializeObject(jsonString, obj.GetType()); } } } |
内置方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空间下的JavaScriptSerializer类进行对象的序列化与反序列化,很直接。
1 2 3 4 5 6 7 8 | Project p = new Project() { Input = "stone" , Output = "gold" }; JavaScriptSerializer serializer = new JavaScriptSerializer(); var json = serializer.Serialize(p); Console.WriteLine(json); var p1 = serializer.Deserialize<Project>(json); Console.WriteLine(p1.Input + "=>" + p1.Output); Console.WriteLine(ReferenceEquals(p,p1)); |
注意:如果使用的是VS2010,则要求当前的工程的Target Framework要改成.Net Framework 4,不能使用Client Profile。当然这个System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感觉有点浪费资源。
此外,从最后一句也可以看到,序列化与反序列化是深拷贝的一种典型的实现方式。
契约方式:使用System.Runtime.Serialization.dll提供的DataContractJsonSerializer或者 JsonReaderWriterFactory实现
注意引用:System.Runtime.Serialization,System.ServiceModel.Web
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 代码 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; namespace CrjIIOfflineAccept.CrjIITools { public class JsonTools { // 从一个对象信息生成Json串 public static string ObjectToJson( object obj) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); MemoryStream stream = new MemoryStream(); serializer.WriteObject(stream, obj); byte [] dataBytes = new byte [stream.Length]; stream.Position = 0; stream.Read(dataBytes, 0, ( int )stream.Length); return Encoding.UTF8.GetString(dataBytes); } // 从一个Json串生成对象信息 public static object JsonToObject( string jsonString, object obj) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); return serializer.ReadObject(mStream); } } } |
这里要注意,这里的Project类和成员要加相关的Attribute:
1 2 3 4 5 6 7 8 | [DataContract] class Project { [DataMember] public string Input { get ; set ; } [DataMember] public string Output { get ; set ; } } |
将类及类变量的访问权限全改为public。
实用参考:
JSON验证工具:http://jsonlint.com/
JSON简明教程:http://www.w3school.com.cn/json/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步