首页 > 代码库 > .net处理JSON简明教程
.net处理JSON简明教程
Json.Net是.net中的一种流行的高性能的JSON框架。
特点
- 灵活的JSON序列化转化.net对象为JSON字符串。和把JSON字符串转换为.net对象。
- 手动读写JSON的Linq to JSON
- 比.net内置的JSON序列化程序更高的性能和速度。
- 便于读写的JSON
- 从XML中读取或写入JSON
- 支持Silverlight和Windows phone.
当你读写的JSON与.net类紧密关联时,JSON序列化程序是一个不错的选择。JSON序列化程序将自动读写相关类的JSON。
如果你只对JSON里面的数据感兴趣、你没有与JSON相关联的.net类或者JSON数据与你的类没有任何关系,你需要从对象中手动读写数据。以上各种情况下,你可以使用LINQ To JSON. LINQ To JSON 允许你在.net中更容易的读取、写入、修改JSON数据。
Download Json.NET from CodePlex or install using NuGet。
PM> Install-Package Newtonsoft.Json
JSON.net下载地址列表
http://json.codeplex.com/releases/view/74287
提供JSON.NET 4.0 Release 3版本地址
http://json.codeplex.com/releases/view/74287#DownloadId=287841
更多JSON详细信息,请查看: http://james.newtonking.com/projects/json-net.aspx
先构造一个简单的类employee
Public class employee{ Public string eid{get;set;} Public string ename{get;set;} Public string esex{get;set;} Public datetime birthday{get;set;}}
JSON序列化与反序列化的方案
- 使用Json.Net 处理JSON序列化与反序列化
序列化方法private string JsonSerialize(employee emp) {return Newtonsoft.Json.JsonConvert.SerializeObject(emp);}反序列化方法private employee JsonDeserialize(string json) {return (employee)(Newtonsoft.Json.JsonConvert.DeserializeObject(json, typeof(employee)));}
- 使用JavaScriptSerializer进行序列化、反序列化
序列化方法 private string JsonSerialize (employee emp) {return new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(emp);}反序列化Private string JsonDeserialize (string json){return (employee)(new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize(json,typeof(employee)));}
- 通过类DataContractJsonSerializer对JSON序列化和反序列化
序列化方法
private string JsonSerialize (employee emp) { System.Runtime.Serialization.Json.DataContractJsonSerializer dcjs = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(employee)); System.IO.MemoryStream ms = new System.IO.MemoryStream(); dcjs.WriteObject(ms, emp); string json = System.Text.Encoding.UTF8.GetString(ms.ToArray()); ms.Close(); return json; }
反序列化方法
private employee JsonDeserialize (string json) { System.Runtime.Serialization.Json.DataContractJsonSerializer dcjs = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(employee)); System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));employee obj = (employee)(dcjs.ReadObject(ms));return obj; }
- 通过Newtonsoft.Json.Linq.JObject获取JSON数据
private void LinqJson(string json) {JObject obj = Newtonsoft.Json.Linq.JObject.Parse(json);//获取全部数据值foreach (JToken token in obj.Values()) {Response.Write(token.ToString());}//获取唯一值Response.Write(obj["eid"].ToString()+"<br />"); }
- 5、LINQ to JSON Example
string json = @"{ ""Name"": ""Apple"", ""Expiry"": new Date(1230422400000), ""Price"": 3.99, ""Sizes"": [ ""Small"", ""Medium"", ""Large"" ]}";JObject o = JObject.Parse(json);string name = (string)o["Name"];// AppleJArray sizes = (JArray)o["Sizes"];string smallest = (string)sizes[0];
JSON序列化和反序列化日期时间的处理
JSON格式不直接支持日期和时间。DateTime值值显示为"/Date(700000+0500)/"形式的JSON字符串,其中第一个数字(在提 供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括"+0500"的部分可选,它指示该时间属于Local 类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为Utc。
使用DataContractJsonSerializer的序列化方式对日期格式进行处理,其他的(反)序列化方案的使用方式是相同的。设计思想是通过正则表达式匹配,替换JSON里面的日期数据为正常的日期格式。
序列化方法
private string JsonSerialize (employee emp) {System.Runtime.Serialization.Json.DataContractJsonSerializer dcjs = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(employee));System.IO.MemoryStream ms = new System.IO.MemoryStream();dcjs.WriteObject(ms, emp);string json = System.Text.Encoding.UTF8.GetString(ms.ToArray());ms.Close();//替换JSON时间为字符串string p = @"\\/Date\((\d+)\)\\/";System.Text.RegularExpressions.MatchEvaluator me = new System.Text.RegularExpressions.MatchEvaluator(ConvertJsonDateToDataString);System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(p);json = regex.Replace(json, me);return json;} private string ConvertJsonDateToDataString(System.Text.RegularExpressions.Match m) {string result = string.Empty;DateTime dt = new DateTime(1970,1,1);dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));dt = dt.ToLocalTime();result = dt.ToString("yyyy-MM-dd HH:mm:ss");return result;}
反序列化方法
private employee JsonDeserialize (string json){string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";System.Text.RegularExpressions.MatchEvaluator me = new System.Text.RegularExpressions.MatchEvaluator(ConvertDateStringToJsonDate);System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(p);json = reg.Replace(json, me); System.Runtime.Serialization.Json.DataContractJsonSerializer dcjs=new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(employee));System.IO.MemoryStream ms=new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));employee emp=(employee)dcjs.ReadObject(ms);return emp;} private string ConvertDateStringToJsonDate(System.Text.RegularExpressions.Match m){string result = string.Empty;DateTime dt = DateTime.Parse(m.Groups[0].Value);dt = dt.ToUniversalTime();TimeSpan ts = dt - DateTime.Parse("1970-1-1");result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);return result;}