JSON

使用JSON.NET动态解析JSON

字号+ 作者:H5之家 来源:H5之家 2016-07-04 18:00 我要评论( )

在NET4.5和MVC4.0中,ASP.NET WEB API作为一个新的组件被发布,WEB API默认采用JSON.NET进行本地序列化, JSON.NET远比内置的WCF中默认的DataContractJsonSerial

你的位置:零度 > 更多发现 > 使用JSON.NET动态解析JSON

使用JSON.NET动态解析JSON

更多发现 admin 3年前 (2013-12-09) 3508浏览

在NET4.5和MVC4.0中,ASP.NET WEB API作为一个新的组件被发布,WEB API默认采用JSON.NET进行本地序列化, JSON.NET远比内置的WCF中默认的DataContractJsonSerializer和JavaScriptSerializer更加灵活,DataContractSerializer本身存在一些问题,因为它不能处理非常流行的非类型化对象和匿名类型,它的可扩展性也是非常有限的。

JSON.NET提供了强大的JSON序列化器,同时具有高级别和低级别的组件,可通过二进制序列化JSON, 支持JSON契约, 可处理XML到JSON格式的转换,提供LINQ TO JSON的访问方式,可序列化.NET任何内置的对象。在ASP.NET MVC API中,JSON.NET作为其默认的序列化器,可通过NUGET直接引入到Web API项目。

动态JSON解析

在开发中,我非常喜欢动态语言和匿名对象带来的优雅,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合、字典、动态对象和匿名对象),在这篇文章中我将通过JToken、JObject和JArray来动态解析JSON对象,使它很容易创建和检索的JSON内容而无需基础类型。

通过JObject和JArray创建JSON对象

我们先用非常简单的方法来动态创建一些JSON,可通过JToken派生的JSON.NET对象来进行,最常见的JToken派生的类是JObject和JArray。

正是因为JToken实现了IDynamicMetaProvider动态语言接口,所以可以使用dynamic关键字直观地创建动态对象,并把这个动态对象序列化为JSON字符串。 我们通过JArray和JObject来创建一个音乐专辑结构的一个示例:

[TestMethod] public void JObjectOutputTest() { // strong type instance var jsonObject = new JObject(); // you can explicitly add values here jsonObject.Add("Entered", DateTime.Now); // dynamic expando instance you can add properties to dynamic album = jsonObject; album.AlbumName = "Dirty Deeds Done Dirt Cheap"; album.Artist = "AC/DC"; album.YearReleased = 1976; album.Songs = new JArray() as dynamic; dynamic song = new JObject(); song.SongName = "Dirty Deeds Done Dirt Cheap"; song.SongLength = "4:11"; album.Songs.Add(song); song = new JObject(); song.SongName = "Love at First Feel"; song.SongLength = "3:10"; album.Songs.Add(song); Console.WriteLine(album.ToString()); }

运行上面的示例代码,就能形成以下结构的JSON内容:

{ "Entered": "2012-08-18T13:26:37.7137482-10:00", "AlbumName": "Dirty Deeds Done Dirt Cheap", "Artist": "AC/DC", "YearReleased": 1976, "Songs": [ { "SongName": "Dirty Deeds Done Dirt Cheap", "SongLength": "4:11" }, { "SongName": "Love at First Feel", "SongLength": "3:10" } ] }

JSON.NET提供一个配置选项,可控制如何生成JSON对象,默认值通常是很好的,但您也可以重写JsonSettings进行个性化的设置。

以上代码最重要的是没有明确指定类型,便可将动态对象进行JSON序列化,而JObject对象只是接收数据,具体结构通过动态语言在运行时生成,这意味着此代码可以在运行时被编译,从而体现动态语言的优势。

在这里我使用JObject创建一张专辑对象,并立即将它强制转换为动态类型。JObject()构造行为有点类似于ExpandoObject ,它允许您简单地向对象动态添加属性。在内部,JObject键值的存储很容易通过IDynamicMetaObject接口暴露出来,从而提供简单的访问方式。

动态对象的语法是非常干净的,你只需要向对象添加属性,不用考虑属性的类型,运行时会自动进行类型推断,对于对象和数组首先需要显式地通过的JObject或者JArray进行创建,然后将其强制转换为动态类型,随后向它动态地添加属性。始终要记住,这些值是动态的,不会被IDE静态编译,因此没有智能感知和类型检查。所以你始终要保证对象的键和值是否拼写错误。

注意:您还可以访问JObject实例直接(非动态)获得基础的JObject类型,这意味着你可以将JSON字符串赋值给属性。

下面是让我们来看看两种风格的相互访问:

// strong type instance var jsonObject = new JObject(); // you can explicitly add values here jsonObject.Add("Entered", DateTime.Now); // expando style instance you can just 'use' properties dynamic album = jsonObject; album.AlbumName = "Dirty Deeds Done Dirt Cheap";

JContainer(基类为JObject和JArray)是一个集合,实现了IEnumerable接口,因此你还可以轻松地在运行时循环访问:

foreach (var item in jsonObject) { Console.WriteLine(item.Key + " " + item.Value.ToString()); } 通过JObject.Parse()和JArray.Parse()方法导入JSON格式

JValue结构支持Parse()和Load()方法,这两个方法可以分别从字符串或各种流读取JSON数据。JValue包括最核心的JSON 解析能力,支持将字符串转化为我们熟悉的动态对象。下面是一个简单的示例:

public void JValueParsingTest() { var jsonString = @"{""Name"":""Rick"",""Company"":""West Wind"", ""Entered"":""2012-03-16T00:03:33.245-10:00""}"; dynamic json = JValue.Parse(jsonString); // values require casting string name = json.Name; string company = json.Company; DateTime entered = json.Entered; Assert.AreEqual(name, "Rick"); Assert.AreEqual(company, "West Wind"); }

以上示例将JSON字符串转换为成JObject对象,并强制转换为动态类型,在测试方法的末尾进行了断言的比较。

在ASP.NET WEB API中使用JObject和JArray

在ASP.NET WEB API控制器中,我们可以通过这些对象接收JSON格式,或者使用动态语言优势进行JSON转换。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • js遍历json数组

    js遍历json数组

    2016-07-05 10:00

  • JSON必知必会

    JSON必知必会

    2016-07-04 17:08

  • Java的JSON转换类库GSON的基础使用教程

    Java的JSON转换类库GSON的基础使用教程

    2016-06-28 14:00

  • GSON实现Java对象的JSON序列化与反序列化的实例教程

    GSON实现Java对象的JSON序列化与反序列化的实例教程

    2016-06-28 13:00

网友点评