JavaScriptSerializer在反序列化时抛出ArgumentNullException

时间:2011-08-23 00:25:16

标签: c# json javascriptserializer argumentnullexception

我正在编写一个应用程序,它在Visual C#4.0中向后端发送JSON或从后端获取JSON。

显然,序列化/反序列化JSON的最简单方法是System.Web.Script.Serialization.JavaScriptSerializer,但是我有一个奇怪的错误,它抛出一个ArgumentNullException,声称该类型为null。

当反序列化以下JSON时,它可以正常工作:

 {"results":[
      {"Name":"Western Bulldogs",
      "updatedAt":"2011-08-22T09:09:09.673Z",
      "Nickname":"Bulldogs",
      "RemoteId":44,
      "Abbreviation":"WB",
      "createdAt":"2011-08-22T09:09:09.673Z",
      "objectId":"2iSK8FDTA6"}
 ]}

但是,当反序列化第二个(使用嵌套字典)时,它会失败,类型为null错误。

{"results":[
    {"EndDate":{"iso":"2011-09-06T00:00:00.000Z","__type":"Date"},
    "Name":"Round 24",
    "updatedAt":"2011-08-22T08:33:54.119Z",
    "RemoteId":800,"createdAt":"2011-08-22T08:33:54.119Z",
    "Season":{"className":"Season","__type":"Pointer","objectId":"WnsdqIlrd6"},
    "Order":24,
    "StartDate":{"iso":"2011-08-30T00:00:00.000Z","__type":"Date"},
    "objectId":"bLdBfhagi9"}
]}        

作为参考,我使用以下方法对两个查询进行反序列化:

JavaScriptSerializer jsSerialise = new JavaScriptSerializer();
ObjectIdContainerList contList = jsSerialise.Deserialize<ObjectIdContainerList>(responseString);

ObjectIdContainerList如下所示(注意 - 它没有实现原始JSON对象的所有属性,因为我只对获取objectId属性感兴趣):

[Serializable]
public class ObjectIdContainerList
{
    public ObjectIdContainer[] results { get; set; }
}

[Serializable]
public class ObjectIdContainer
{
    public String objectId { get; set; }
}

第一个查询在没有问题的情况下反序列化完全相同的代码和对象。

有什么建议吗?我最好去JSON.NET吗?

2 个答案:

答案 0 :(得分:1)

当你应该能够简单地执行此操作时,我不明白ObjectIdContainerList的用途是什么:

jsSerialise.Deserialize<List<ObjectIdContainer>>(responseString) 
and get a List of ObjectIdContainer

我还要确保ObjectIdContainer有一个名为“__type”的属性,它包含一个字符串。我提到它是因为这是C#中类属性的奇怪名称。

编辑:我刚看到你发布了剩下的代码......

您是否希望能够将响应字符串反序列化为ObjectIdContainer数组,其中ObjectIdContainer只有一个名为objectId的属性?如果你能做到这一点,我会非常感动。

我记得Reflector曾经告诉我,JavascriptSerializer的实现基本上使用反射来序列化/反序列化对象;因此,您需要一个具有与JSON对象中定义的属性名称相同的属性名称的相应类,否则它将失败。

答案 1 :(得分:1)

我对回答我自己的问题感到有些不好,但我最终通过使用Json.Net以几乎完全相同的代码对对象进行反序列化来解决问题,并且它有效。

我不倾向于说这是.Net框架中的一个错误,但有点感觉。

感谢那些帮助过的人!