Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当从C#程序中反序列化JSON时,我是否需要使用JavaScriptSerializer之外的任何东西?_C#_.net_Json_Serialization - Fatal编程技术网

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

当从C#程序中反序列化JSON时,我是否需要使用JavaScriptSerializer之外的任何东西?,c#,.net,json,serialization,C#,.net,Json,Serialization,.NET在中提供JavaScriptSerializer类 System.Web.Script.Serialization命名空间。(在System.Web.Extensions.dll中提供) 它最初旨在支持AJAXWeb服务器应用程序,但该类可由任何将.NET类序列化和反序列化为JSON的应用程序(客户端、服务器、混合型应用程序、任何应用程序)使用。我有一个桌面应用程序,可以捕获屏幕截图并上传到Facebook,并使用这个类来反序列化响应 我是否希望从.NET内的其他地方寻找JSON反序列化

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

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

我是否希望从.NET内的其他地方寻找JSON反序列化

若然,原因为何?我会去哪里



如果没有,那么为什么JSON.Net存在呢?这完全是出于历史目的吗?(即,因为它是由社区在JavaScriptSerializer之前创建的)

我在各种各样的场景中使用JavaScriptSerializer,它从未让我失望,也从未需要在其他地方寻找其他解决方案……:)


…但我知道JSON.net有一些附加值,比如LINQ to JSON,这是我从来都不需要的,还有很好的JSON格式,但随着序列化的进行,JavaScriptSerializer做得很好。

在我的例子中,有各种原因阻止我使用它。这里有一些

1)处理匿名类型时,反序列化非常糟糕

虽然序列化的用法相当简单:

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
String json = serializer.Serialize(data); 
但是,对于反序列化,有一个小麻烦,即反序列化程序接受泛型类型和内容:

serializer.Deserialize<T>(String s) 

请注意:根据Dave Ward对此答案的评论,有一个
反序列化对象()
可以用来防止这种情况发生

2)无法处理循环引用

我看到过使用LINQtoSQL、NHibernate、NetTiers甚至在使用时使用这些工具

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

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

3)导致可测试代码更少的有用功能

JavaScriptSerializer的一个有用特性是,您还可以实现自定义JavaScriptConverter并将其传递给JavaScriptSerializer,以便对序列化/反序列化进行细粒度控制。然而,为了使它真正有用,您需要在编译时了解这些类型,并有对这些类型的引用。这实际上限制了该特性的实用性,因为通过引用这些类,代码变得紧密耦合,因此您无法在类似MVC过滤器的东西中轻松使用它

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


希望这有帮助

嗯,如果我已经有linqto对象,“linqtojson”给了我什么?它是否只对我选择的字段进行反序列化?他说的是API LINQ to Json Re#1,你要找的是JavaScriptSerializer的DeserializeObject()方法,而不是Deserialize()。很好,很容易/灵活。@Dave Ward:接得好!我编辑了答案以反映这一点
var result = typeof(JavaScriptSerializer).GetMethod("Deserialize") 
             .MakeGenericMethod(JsonDataType) 
             .Invoke(serializer, new object[] { inputContent });