我正在编写一个应用程序,它在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吗?
答案 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框架中的一个错误,但有点感觉。
感谢那些帮助过的人!