第四周的NuGet软件包 - 用Json.NET反序列化JSON
[原文发表地址] NuGet Package of the Week #4 - Deserializing JSON with Json.NET [原文发表时间] 2011-04-01 01:15 AM 嗨,您实施了NuGet行动计划吗?行动起来吧,它只需5分钟: NuGet行动计划——升级到1.2版本,设置自动更新,获取NuGet 软件包浏览器。NuGet 1.2来了,请确保您已经设置好了自动更新! 故事背景:我正在思考既然NuGet.Net软件包管理网站开始逐渐充实,那么我应该开始在那寻找宝石了(没有双关含义)。您知道,就是那种大家可能没法发现的真正有用的东西。我将主要寻找开放源代码项目——我认为它们很有用。我会查看它们如何生成NuGet软件包,看看它们设计开箱体验(out of the box experience)时有没有什么有趣的地方(以及任何它们可以改进的举措),当然也会关注软件包本身所做的事。 Json.Net是一个很受欢迎的高性能的.NET JSON框架 如果你要在网络中传输数据,你肯定会遇到JSON(JavaScript Object Notation) 或者像我喜欢叫它的,带花括号的XML(开玩笑)(不,我不是在开玩笑,大多数情况下你可以很容易的在XML和JSON之间转换) 它是一个轻量级的数据交互格式。”对人们来说它很容易阅读和编辑, 对计算机来说它很容易解析和生成。” 它也仅仅是JavaScript。
来自JSON.ORG: JSON 建立在两种结构之上: 键/值对的集合。在不同的语言,这种集合可以被理解为一个对象,记录,结构,字典,哈希表,键列表或者相关联的数组。 一个排序的值列表。在多数语言中,可以被理解为数组,向量,列表,或序列。 简单的说就是一个对象是由一个键/值对或者一个对象列表所组成。那就是它。由于这种结构够灵活并且能够很好的和JavaScript一起运行,所以用它来操作数据是相当好的。并且已经变成一种标准来访问很多著名的网站的API,像Twitter和Facebook. Json.NET是James Newton-King所开发的优秀的库,用它可以在.NET上访问和处理JSON。4.0版本很酷,不仅因为它可以在NuGet??找到,而且它是现在的在Windows Phone上处理JSON数据框架的最好方式。Json.NET因为James在性能上固执的关注 (请看图标和曲线图!)而得到关注。事实上我在2006写了篇Json.NET的博文。 深入Json.NET NuPkg 如果你用NuGet软件包浏览器(这是一个ClickOnce链接,孩子)来打开Newtonsoft.Json.4.0.1.nupkg。你会发现James是如何打包自己的库的。
首先,你会发现在他的/lib目录中有很多子目录。对于最后的这个NuGet包我只讨论了不多,但是James却把它做到了最好,感谢他! 在NuGet中,你可以有一个包含很多Framework版本的程序集的包。在支持.NET Framework的多种版本中可以查看NuGet文档。 James已经为Json.NET创建了一个独立的NuGet包,可以在.NET 2.0,3.5,4,SL4和Windows Phone 7使用。真好。 我认为James应该添加一个Newtonsoft.Json.Sample包,像David Ebbo's 发布的 "用示例软件包将NuGet提升到下一个水平." 中提到的那样。我发现自己不知从哪开始Json.NET,因为没有示例代码。不用担心,上网去找!James在他的站点上有很棒的Json.NET文档。 使用Json.NET我做了一个小网站SmallestDotNet.com,可以用你游览器的UserAgent(和一些JavaScript)来查看你的系统,并且告诉你你有哪个.NET版本,哪个最小的更新版本适合你来下载。 注意: 这个SmallestDotNet网站是在2008年上线的,在IE9中运行会出现问题,直到我罗马尼亚(Twitter的账号是@CalinBalauru)的新朋友Calinoiu Alexandru Nicolae自告奋勇来修复它。非常感谢Calin为SmallestDotNet网站所做的工作,工作现在还在进行中。 这个站点还会提供一个简单的JSON有效负载,这里面提供了正确的直接链接到合适你的下载。我一直不明白为什么找到.NET下载会这么难,所以我们把它做进JSON负载中,这样你就可以以编程的方式访问它。 SmallestDotNet JSON payload看起来像下面这样,并不复杂,只是这样简单而已。 或许我可以 { "latestVersion": null, "allVersions": [ ], "downloadableVersions": [ { "major": 4, "minor": 0, "profile": "client", "servicePack": null, "url": "http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=5765d7a8-7722-4888-a970-ac39b33fd8ab" }, { "major": 4, "profile": "full", "url": "http://www.microsoft.com/downloads/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=en" }, { "major": 3, "minor": 5, "servicePack": 1, "url": "http://www.microsoft.com/downloads/details.aspx?FamilyId=8CEA6CD1-15BC-4664-B27D-8CEBA808B28B&displaylang=en" }, "url": "http://go.microsoft.com/fwlink/?LinkId=124150" }, "url": "http://www.microsoft.com/downloads/details.aspx?FamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&displaylang=en" }, { "major": 2, "servicePack": 2, "url": "http://www.microsoft.com/downloads/details.aspx?familyid=5B2C0358-915B-4EB5-9B1D-10E506DA9D0F&displaylang=en" }, { "major": 1, "minor": 1, "url": "http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en" } ] } 用Json.NET来访问这个数据?我想知道这么做是容易还是难,有很多种方法,其中一种是在JSON.NET中使用JObject”DOM”: var client = new WebClient(); client.Headers.Add("User-Agent","Nobody"); var response = client.DownloadString(new Uri("http://www.hanselman.com/smallestdotnet/json.ashx")); JObject o = JObject.Parse(response);' //Now o is an object I can walk around... 或者,我可以使用C#类,它的结构类似于我之前的JSON负载,然后讲他反序列化,这非常的酷: class Program { static void Main(string[] args) { var client = new WebClient(); client.Headers.Add("User-Agent","Nobody"); //my endpoint needs this... var response = client.DownloadString(new Uri("http://www.hanselman.com/smallestdotnet/json.ashx")); var j = JsonConvert.DeserializeObject<SmallestDotNetThing>(response); } public class SmallestDotNetThing { public DotNetVersion latestVersion { get; set; } public List<DotNetVersion> allVersions { get; set; } public List<DotNetVersion> downloadableVersions { get; set; } } public class DotNetVersion { public int major { get; set; } public int minor { get; set; } public string profile { get; set; } public int? servicePack { get; set; } public string url { get; set; } } } 现在在截屏中看看j变量,很酷是吧?
有很多种方法,让你可以用.NET去处理你的JSON。 Json.NET新特性 新的Json.NET是用.NET 4编译的,并且包含了一些很酷的动态支持。从James的博客中我们可以看到他们是如何工作的,C#4的动态关键字和JSON一起工作是多么的有意思。 JObject oldAndBusted = new JObject(); oldAndBusted["Name"] = "Arnie Admin"; oldAndBusted["Enabled"] = true; oldAndBusted["Roles"] = new JArray(new[] { "Admin","User" }); string oldRole = (string) oldAndBusted["Roles"][0]; // Admin dynamic newHotness = new JObject(); newHotness.Name = "Arnie Admin"; newHotness.Enabled = true; newHotness.Roles = new JArray(new[] { "Admin","User" }); string newRole = newHotness.Roles[0]; // Admin
这真的是一个了不起的开源库,当你做任何用到JSON的东西的时候,我推荐你去使用它,这也许是对James努力的最好回报。谢谢,James! 另一个Json 库: JsonFx 2.0 如果你真的对用C# dynamics来使用JSON很感兴趣,从 GitHub或者JsonFx on NuGet可以找到JsonFx 2.0! 这个库非常易于动态使用。 看下下面的示例代码:
结果如下,注意这是C#动态类型的对象:
很好,用的开心! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |