【问题标题】:JavaScriptSerializer throwing ArgumentNullException on deserializationJavaScriptSerializer 在反序列化时抛出 ArgumentNullException
【发布时间】:2011-08-23 00:25:15
【问题描述】:

我正在编写一个应用程序,该应用程序在 Visual C# 4.0 中向/从后端发布和获取 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"}
 ]}

但是,当反序列化第二个(使用嵌套字典)时,它会失败并出现 type is 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 吗?

【问题讨论】:

  • 先贴出你的 ObjectIdContainerList ,如果可能的话,不要遗漏 json 数据,这样我们就可以看到到底发生了什么。

标签: c# json javascriptserializer argumentnullexception


【解决方案1】:

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

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

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

编辑:我刚刚看到您发布了其余代码...

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

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

【讨论】:

  • 我实际上最初尝试过,但因为它不是一个直接的 JSON 数组,而是一个以结果为键和数组为对象的字典,所以它不起作用。就像我在问题中所说的那样,我的第一个没有嵌套字典的查询适用于这些 ObjectIdContainer。我同意,这不是一个好的解决方案,但它确实有效
  • 但它真的适用于第一种情况吗?我会假设它确实运行了,但您只捕获字符串的 objectId 值(在您的示例中为 2iSK8FDTA6),而没有获取所有其他属性,例如 Name、NickName 等。您是否检查了 Deserialize 方法返回的类当您在第一个示例中调用它时?所有属性返回的所有值是多少?我非常怀疑您获得的不仅仅是 objectId 的值,因为这是唯一在您的 C# 类中具有相应属性的值。
  • 我不想要任何其他变量 - objectId 是我唯一需要的变量。抱歉,我可能会让这个更清楚一点。
【解决方案2】:

我觉得回答自己的问题有点糟糕,但我最终解决了这个问题,使用 Json.Net 用几乎完全相同的代码反序列化对象并且它工作正常。

我不倾向于说这是 .Net 框架中的错误,但感觉就是这样。

感谢帮助的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 2015-01-11
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多