在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提供的序列化程序。 看看这篇文章,看看为什么:
JSON.Net存在的原因是JavaScriptSerializer直到.Net 3.5才出现。 JSON.Net在此之前就存在了。