1

我正在编写一个在 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"}
 ]}

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

4

2 回答 2

1

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

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

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

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

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

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

于 2011-08-23T03:25:50.907 回答
1

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

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

感谢帮助过的人!

于 2011-08-23T08:30:27.993 回答