.NET在System.Web.Script.Serialization命名空间中提供JavaScriptSerializer类 . (在System.Web.Extensions.dll中提供)
它最初旨在支持AJAX Web服务器应用程序,但该类可以被任何应用程序(客户端,服务器,混合,任何)使用,它们将.NET类序列化和反序列化为JSON . 我有一个桌面应用程序,可以捕获屏幕截图并上传到Facebook,并使用此类来反序列化响应 .
我是否想在其他地方寻找.NET内的JSON反序列化?
如果是这样,为什么?我会在哪里看?
如果没有,那为什么JSON.Net存在?它是否严格用于历史目的? (即,因为它是由JavaScriptSerializer之前的社区创建的) .
3 回答
在我的情况下,有各种原因阻止我使用JavaScriptSerializer . 这里是其中的一些 .
1) Ugly deserialization when dealing with anonymous types
虽然序列化的使用非常简单:
JavaScriptSerializer serializer = new JavaScriptSerializer();
String json = serializer.Serialize(data);
然而,对于反序列化,有一个小麻烦,因为反序列化器接受泛型类型以及内容:serializer.Deserialize <T>(String s)
如果在编译时不知道类型T并且需要是动态的,那么这可能是个问题 . 我学习的工作有点难看,因为它使用反射创建一个通用方法(但它有效)var result = typeof(JavaScriptSerializer).GetMethod(“Deserialize”)
.MakeGenericMethod(JsonDataType)
.Invoke(serializer,new object [] );
Please note :根据Dave Ward对这个答案的评论,有一个
DeserializeObject()
可以用来防止这种情况发生 .2) Cannot handle circular references
我已经看过这个使用Entity Framework,Linq to SQL,NHibernate,NetTiers甚至在使用Castle's proxy时 .
根据MS Connect,当可导航关系是双面的(可以访问关系的两边)时,将引发循环引用异常,因此首先要做的是禁用关系的一侧 . 当您使用1:1关系(或1:0..1或任何导致创建EntityReference类型属性的关系)时,也会抛出异常,在这种情况下,异常的类型为
System.Data.Metadata.Edm.AssociationType
.解决方案是使序列化程序忽略EntityReference类型的属性,使用从JavaScriptConverter派生的类的空实现,并使用JavaScriptSerializer对象的RegisterConverters方法注册它 .
3) Useful features that leads to less testable code
JavaScriptSerializer的一个有用功能是您还可以实现自定义JavaScriptConverter并将其传递给JavaScriptSerializer,以便对序列化/反序列化进行细粒度控制 . 但是,为了使它非常有用,您需要在编译时知道类型并引用这些类型 . 这确实限制了此功能的实用性,因为通过引用这些类,您的代码将紧密耦合,因此您无法轻松地将其用于MVC过滤器之类的东西 .
由于这些原因,我经常最终使用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在此之前就存在了 .