- Comments 0
[原文发表地址] 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! 这个库非常易于动态使用。
看下下面的示例代码:
1 |
|
结果如下,注意这是C#动态类型的对象:
很好,用的开心!