JSON in .NET (JSON在.NET中的应用)


JSON in .NET JSON 在.NET 中的应用 随着 JSON 这种轻量级的数据格式作为客户端与服务器之间的传输格式逐渐 流行,进而出现的问题是如何将服务器端构建好的 JSON 数据转化为可用的 JavaScript 对象。 2010 Sunny D.D www.cnblogs.com/sunnycoder sunny19788989@gmail.com 2010-03-21 www.cnblogs.com/sunnycoder Sunny D.D JSON in .NET 2 / 9 JSON 简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它易于编程人员阅读和编写,同时也 易于机器解析和生成。它基于 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999 的一个子集。JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括 C, C++, C#, Java, JavaScript, Perl, Python 等)。这些特性使 JSON 成为理想的数据交换语言。 客户端 使用 JSON 方式创建对象 Object 方式 function Person(name, age){ this.Name = name; this.Age = age; } var p = new Person("Sunny D.D", 25); alert(p.Name) //输出 Sunny D.D alert(p.Age) //输出 25 使用上述代码创建对象,需要先写出对象的类,使用 new 关键字来创建对象。下面将介绍 JSON 创建 对象的方式,它更像 C#中的匿名类。 JSON 方式 var json = {"Name":"Sunny D.D", "Age":25}; alert(p.Name) //输出 Sunny D.D alert(p.Age) //输出 25 可以看出,上述两种方式创建的对象实际上是一样的,但使用 JSON 方式创建对象更简便,非常适合 创建一个临时的用来存储数据的对象。使用 JSON 方式创建的对象是不是与 c#的匿名对象很相似呢? 为什么说使用 JSON 方式创建的对象与 c#的匿名对象很相似,而不是相同呢?因为在 C#中,匿名对象 是不能传递的,也就是说不能通过参数的形式传递给另一个方法进行处理。但根据 JavaScript 语言的特点, 对于 Object 对象没有严格的类型限制,这样就可以进行方便的传递了: function showName(person){ alert(person.Name); } showName(json) //输出 Sunny D.D 获取 JSON 对象的字符串表示 使用 json.js 可以方便的将对象转换为 JSON 的字符串形式。下载地址 在 json.js 文件的最下面,可以看到这样一段代码: www.cnblogs.com/sunnycoder Sunny D.D JSON in .NET 3 / 9 if (!Object.prototype.toJSONString) { Object.prototype.toJSONString = function (filter) { return JSON.stringify(this, filter); }; Object.prototype.parseJSON = function (filter) { return JSON.parse(this, filter); }; } 可以看到,它将判断对象类型是否有 toJSONString 这样一个方法,如果没有,将会为对象加入 toJSONString 方法与 parseJSON 这两个方法。 引入了这个 js 文件后,就可以简单地调用 toJSONString 方法来获取对象的 JSON 字符串形式: var jsonStr = p.toJSONString(); 输出 jsonStr,可以获得字符串"{"Name":"Sunny D.D","Age":25}"。 将字符串转换为 JSON 对象 在引入了 json.js 后,可以简单地调用 JSON.parse(text),或者 text.parseJSON()来将字符串转换为对象, 但是需要注意的是,在一个 string 对象上调用 parseJSON()时,会报一个错误“illegal access”,这是因为 在代码“return JSON.parse(this, filter);”处,this 的类型是一个 Object,这可能是一个 bug,稍加改动即 可通过: if (!Object.prototype.toJSONString) { Object.prototype.toJSONString = function (filter) { return JSON.stringify(this, filter); }; Object.prototype.parseJSON = function (filter) { return JSON.parse(this + "", filter); }; } 这样就可以确保传递给 JSON.parse 方法的第一个参数是 string 类型的对象。 服务器端 LINQ to JSON 获取 LINQ to JSON 的开源资源,可以访问 http://json.codeplex.com/。 如果仅使用,可以下载 Newtonsoft.Json.dll。 在项目中引用 Newtonsoft.Json.dll 就可以获得 LINQ to JSON 的能力了。在下面的示例中,我使用到了 Northwind 数据库,使用 LINQ to SQL 方式读取所有产品类别数据,创建一个 JObject 对象: using (NorthwindDataContext db = new NorthwindDataContext()) { JObject json = new JObject( //创建JSON对象 db.Categories.Select( c => new JProperty( //创建JSON属性 c.CategoryName, //属性名称(在这里是产品类别名称) www.cnblogs.com/sunnycoder Sunny D.D JSON in .NET 4 / 9 new JArray( //属性的值(在这里是该类别下的所有产品名称) c.Products.Select( p => p.ProductName ) ) ) ) ); ltrJson.Text = json.ToString(); } 上述代码生成的数据结构如下: “类别名称” : [“产品名称”, “产品名称”, “产品名称”,„] , “类别名称” : [“产品名称”, “产品名称”, “产品名称”,„] ,„„ 在前台页面获取 ltrJson.Text,然后调用 JSON.parse(ltrJson.Text),就可以获取到生成的对象了。 可以看出,LINQ to JSON 提供程序支持我们以习惯的 LINQ 方式读取、创建对象,简化了开发过程,让 我们的注意力可以集中在业务流程上。 下面简单地介绍 LINQ to JSON 中常用的几个类。 LINQ to JSON JavaScript 描述 JObject Object 对象 JProperty string 属性名 JArray Array 数组 JValue string,number,object,array,true,false,null 属性的值 使用 LINQ to JSON 创建的对象,都可以简单地调用 ToString 方法来获取 JSON 字符串。此方法有两个重 载形式,第一个是无参形式,可以按照默认格式获取 JSON 字符串;也可以调用有参格式,使用自定义格 式来生成 JSON 字符串。 将字符串转换为 JObject 对象 在后台程序中可以通过 JObject 的静态方法 Parse 将字符串转换为一个 JObject 对象: JObject o = JObject.Parse(json); 转换成功后,就可以利用 LINQ to JSON 的特性来进行相关操作了。 LINQ to JSON 中的查询 要使用 LINQ to JSON 进行查询,就必须要了解它的数据结构: www.cnblogs.com/sunnycoder Sunny D.D JSON in .NET 5 / 9 可以看出,其所有的类都派生于 JToken,也就是说所有的 LINQ to JSON 对象都可以用 JToken 来表示, 即 JObject、JProperty 还是 JArray 都可以利用李氏替换原则而用 JToken 来表示。认清这一点是非常必要的, 因为接下来的示例中将多次用到他们之间的类型转换。 遍历一个 JToken 中所包含的元素,可以使用 JTokenObj. Children 方法,例如: using (ProductDataContext db = new ProductDataContext()) { JObject json = new JObject( //创建JSON对象 db.Categories.Select( c => new JProperty( //创建JSON属性 c.CategoryName, //属性名称(在这里是产品类别名称) new JArray( //属性的值(在这里是该类别下的所有产品名称) c.Products.Select( p => p.ProductName ) ) ) ) ); foreach (JProperty i in json.Children()) //遍历JSON对象的所有属性 { Console.WriteLine("类别为{0}的产品列表", i.Name); //输出属性的名称 JArray arr = (JArray)i.Value; //获取属性的值(在这里是该类别下的所有产品名称) www.cnblogs.com/sunnycoder Sunny D.D JSON in .NET 6 / 9 foreach (JValue j in arr) //遍历产品名称集合 { Console.WriteLine(j.Value); //输出产品名称 } Console.WriteLine("-----------------------------------------------------"); } 上述示例运行后,将输出所有的产品类别,以及属于对应类别的所有产品信息。 既然讲 LINQ to JSON,那么就可以在其所有的对象上使用 LINQ to Object(标准查询操作符)的方式进 行查询。在下面的示例中,演示了如何使用 LINQ to Object(标准查询操作符)的方式对 JSON 对象进行查 询: using (ProductDataContext db = new ProductDataContext()) { JObject json = new JObject( //创建JSON对象 db.Categories.Select( c => new JProperty( //创建JSON属性 c.CategoryName, //属性名称(在这里是产品类别名称) new JArray( //属性的值(在这里是该类别下的所有产品名称) c.Products.Select( p => p.ProductName ) ) ) ) ); var q = json.Children() //获取JSON对象的所有属性 .Where(j => j.Name.StartsWith("C")) //结果只包含属性名称以"C"开头的 .OrderBy(j => ((JArray)j.Value).Count) //以属性的值中包含的元素个数排序 .Select(j => j.Name); //查询结果仅包含属性名称 foreach (string i in q) //遍历并输出属性名称 { Console.WriteLine(i); } } LINQ to JSON 与 XmlDocument 之间的转换 使用 LINQ to JSON,可以方便地在 JSON 对象与 XmlDocument 对象间进行转换。在以下两个示例中, 演示了转换过程: www.cnblogs.com/sunnycoder Sunny D.D JSON in .NET 7 / 9 将 XmlDocument 对象转换为 JSON 字符串 string xml = @" Alan http://www.google.com Louis http://www.yahoo.com "; XmlDocument xdoc = new XmlDocument(); xdoc.LoadXml(xml); string jsonText = JsonConvert.SerializeXmlNode(xdoc); Console.WriteLine(jsonText); 将 JSON 字符串转换为 XmlDocument 对象 string json = @"{ ""?xml"": { ""@version"": ""1.0"", ""@standalone"": ""no"" }, ""root"": { ""person"": [ { ""@id"": ""1"", ""name"": ""Alan"", ""url"": ""http://www.google.com"" }, { ""@id"": ""2"", ""name"": ""Louis"", ""url"": ""http://www.yahoo.com"" } ] } }"; XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json); www.cnblogs.com/sunnycoder Sunny D.D JSON in .NET 8 / 9 LINQ to JSON & LINQ to XML 在本文前面的讨论中,已经包含了 JSON 字符串、LINQ to JSON 对象和 XmlDocument 之间的转换方法, 那么 LINQ to JSON 与 LINQ to XML 之间也是可以互相操作的。但是其具体操作方法及是否必要将在以后讨 论,大家也可以进行试验。 AJAX 使用 AJAX 获取 JSON 在实际应用中,常会使用 Ajax 从后台程序中获取数据,然后呈现在页面中。在本示例中为了简化操作, 创建了一个“一般处理程序”(.ashx 文件)作为后台数据的提供程序,然后在页面中使用 Ajax 访问它获取 一个 JSON 对象,然后访问 JSON 对象的 AllProducts 属性: Command/GetProductsByCategoryIDHandler.ashx 文件: <%@ WebHandler Language="C#" Class="GetProductsByCategoryIDHandler" %> using System; using System.Web; using System.Linq; using Newtonsoft.Json.Linq; public class GetProductsByCategoryIDHandler : IHttpHandler { public void ProcessRequest (HttpContext context) { HttpResponse response = context.Response; HttpRequest request = context.Request; int categoryID = Int32.Parse(request["categoryID"]); //传递过来的类别ID JObject json = null; using (NorthwindDataContext db=new NorthwindDataContext()) { string[] productNames = db.Categories //访问Northwind数据库的产品类别表 .Single(c => c.CategoryID == categoryID) //根据ID获取唯一实例 .Products //获取此类别的所有产品 .Select(p => p.ProductName) //结果只包含产品名称 .ToArray(); //转换为数组 //实例化JObject对象,同时为其加入一个名为AllProducts的属性 json = new JObject( new JProperty("AllProducts", new JArray(productNames)) ); } response.ContentType = "text/plain"; response.Write(json.ToString()); } www.cnblogs.com/sunnycoder Sunny D.D JSON in .NET 9 / 9 public bool IsReusable { get { return false; } } } 页面代码: JsonAjax Demo
然后,在脚本中调用 getProductsByStandard(1),就会在页面中显示类别 ID 为 1 的所有产品的产品名称 了。要显示其他类别的产品,只需要改变 getProductsByStandard 方法的参数即可。 本文中使用到的资源 Northwind 数据库下载 json.js 下载 Newtonsoft.Json.dll 下载 Json.NET 资源浏览
还剩8页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

li820

贡献于2012-02-28

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf