首页 文章

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

提问于
浏览
8

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

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

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

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


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

3 回答

  • 1

    在我的情况下,有各种原因阻止我使用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 .

    希望这可以帮助!

  • 1

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

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

  • -1

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

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

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

相关问题