在C#程序中反序列化JSON时,我是否需要使用除JavaScriptSerializer之外的任何东西?

.NET在System.Web.Script.Serialization命名空间中提供JavaScriptSerializer类。 (在System.Web.Extensions.dll中提供)

它最初旨在支持AJAX Web服务器应用程序,但该类可以被任何应用程序(客户端,服务器,混合,任何)使用,它们将.NET类序列化和反序列化为JSON。 我有一个桌面应用程序,可以捕获屏幕截图并上传到Facebook,并使用此类来反序列化响应。

我是否想在其他地方寻找.NET内的JSON反序列化?

如果是这样,为什么? 我会在哪里看?


如果没有,那为什么JSON.Net存在? 它是否严格用于历史目的? (即,因为它是由JavaScriptSerializer之前的社区创建的)。

在我的情况下,有各种原因阻止我使用JavaScriptSerializer 。 这里是其中的一些。

1)处理匿名类型时的丑陋反序列化

虽然序列化的使用非常简单:

JavaScriptSerializer serializer = new JavaScriptSerializer(); String json = serializer.Serialize(data); 

然而,对于反序列化,有一个小麻烦,因为反序列化器接受generics类型以及内容:

 serializer.Deserialize(String s) 

如果在编译时不知道类型T并且需要是动态的,那么这可能是个问题。 我学习的工作有点难看,因为它使用reflection创建一个通用的方法(但它的工作原理)

 var result = typeof(JavaScriptSerializer).GetMethod("Deserialize") .MakeGenericMethod(JsonDataType) .Invoke(serializer, new object[] { inputContent }); 

请注意 :根据Dave Ward对此答案的评论,可以使用DeserializeObject()来防止这种情况发生。

2)无法处理循环引用

我已经看到了这个使用Entity Framework ,Linq to SQL,NHibernate,NetTiers甚至使用Castle的代理 。

根据MS Connect ,当可导航关系是双面的(可以访问关系的两侧)时,将引发循环引用exception,因此首先要做的是禁用关系的一侧。 当您使用1:1关系(或1:0..1或任何导致创建EntityReference类型属性的关系)时,也会抛出exception,在这种情况下exception将是System.Data.Metadata.Edm.AssociationType类型System.Data.Metadata.Edm.AssociationType

解决方案是使序列化程序忽略EntityReference类型的属性,使用从JavaScriptConverter派生的类的空实现,并使用JavaScriptSerializer对象的RegisterConverters方法注册它。

3)导致可测试代码较少的有用function

JavaScriptSerializer的一个有用function是您还可以实现自定义JavaScriptConverter并将其传递给JavaScriptSerializer,以便对序列化/反序列化进行细粒度控制。 但是,为了使它非常有用,您需要在编译时知道类型并引用这些类型。 这实际上限制了此function的实用性,因为通过引用这些类,您的代码将紧密耦合,因此您无法轻松地在MVCfilter中使用它。

由于这些原因,我经常最终使用Json.NET。

希望这可以帮助!

我在各种各样的场景中使用JavaScriptSerializer,它永远不会让我失望,并且永远不需要寻找其他解决方案…… 🙂

…但我知道JSON.net有一些附加值,如LINQ to JSON,我从不需要,以及漂亮的JSON格式,但作为序列化,JavaScriptSerializer工作正常。

我不会使用.Net提供的序列化程序。 看看这篇文章,看看为什么:

http://www.reddit.com/r/linux/comments/epd5z/microsoft_standards_and_incompatibility_19912010/c19v88j

JSON.Net存在的原因是JavaScriptSerializer直到.Net 3.5才出现。 JSON.Net在此之前就存在了。