第四周的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。

image

来自JSON.ORG:

JSON 建立在两种结构之上:

clip_image001[10] /值对的集合。在不同的语言,这种集合可以被理解为一个对象,记录,结构,字典,哈希表,键列表或者相关联的数组。

clip_image001[11] 一个排序的值列表。在多数语言中,可以被理解为数组,向量,列表,或序列。

简单的说就是一个对象是由一个键/值对或者一个对象列表所组成。那就是它。由于这种结构够灵活并且能够很好的和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,

“minor”: 0,

“profile”: “full”,

“servicePack”: null,

“url”: “http://www.microsoft.com/downloads/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=en”

},

{

“major”: 3,

“minor”: 5,

“profile”: “client”,

“servicePack”: 1,

“url”: “http://www.microsoft.com/downloads/details.aspx?FamilyId=8CEA6CD1-15BC-4664-B27D-8CEBA808B28B&displaylang=en”

},

{

“major”: 3,

“minor”: 5,

“profile”: “full”,

“servicePack”: 1,

“url”: “http://go.microsoft.com/fwlink/?LinkId=124150”

},

{

“major”: 3,

“minor”: 0,

“profile”: “full”,

“servicePack”: 1,

“url”: “http://www.microsoft.com/downloads/details.aspx?FamilyId=10CC340B-F857-4A14-83F5-25634C3BF043&displaylang=en”

},

{

“major”: 2,

“minor”: 0,

“profile”: “full”,

“servicePack”: 2,

“url”: “http://www.microsoft.com/downloads/details.aspx?familyid=5B2C0358-915B-4EB5-9B1D-10E506DA9D0F&displaylang=en”

},

{

“major”: 1,

“minor”: 1,

“profile”: “full”,

“servicePack”: 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变量,很酷是吧?

The JSON has deserialized into C# objects in a Watch Window

有很多种方法,让你可以用.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

dynamic foo = new JsonFx.Json.JsonReader().Read(response);

结果如下,注意这是C#动态类型的对象:

很好,用的开心!


Comments (0)

Skip to main content