2011-08-23 93 views
1

拋出ArgumentNullException我正在寫一個應用程序,崗位,並得到JSON /從在Visual C#4.0中的後端。JavaScriptSerializer上反序列化

很顯然,序列化/反序列化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

首先發表您的ObjectIdContainerList如果可能的話,無遺漏的JSON數據,讓我們看到了什麼是真正回事。 –

回答

1

我覺得回答我的問題有種不好的,但我最終用Json.Net幾乎一模一樣的代碼deserialise對象解決問題和它的工作。

我不傾向於說,這是在.NET Framework中的一個錯誤,但它那種覺得這種方式。

感謝那些誰幫助!

1

我不明白什麼是ObjectIdContainerList的目的時,你應該能夠簡單地做到這一點:

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

我也將確保ObjectIdContainer有一個名爲「__type」保存的字符串屬性。我提到它是因爲這是C#中類屬性的奇怪名稱。

編輯:我剛纔看到你發佈你的代碼的其餘部分...

你是說你希望能夠響應字符串反序列化到一個數組ObjectIdContainer的地方ObjectIdContainer只有一個叫做物業OBJECTID?如果你能做到這一點,我會非常感動。

我記得一次反射向我表明了JavascriptSerializer的實施主要採用反射序列化/反序列化對象;因此,您需要一個與您的JSON對象中定義的屬性名稱相同的相應類,否則它將失敗。

+0

我實際上最初嘗試過,但因爲它不是一個平直的JSON數組,而是一個結果作爲鍵和一個數組作爲對象的字典,所以它不起作用。就像我在問題中所說的那樣,沒有嵌套字典的第一個查詢與這些ObjectIdContainers一起工作。我同意,這不是一個好的解決方案,但它**工作**。 – Alastair

+0

但它真的在第一個案件上工作?我假設它確實運行,但你只捕獲字符串的objectId值(在你的例子中是2iSK8FDTA6),並沒有得到所有其他屬性,如Name,NickName等等。你是否檢查了Deserialize方法返回的類當你在第一個例子中調用它時?什麼是所有屬性返回的值?我非常懷疑你獲得的不僅僅是objectId的值,因爲這是唯一一個在C#類中具有相應屬性的值。 – Icarus

+0

我不想要任何其他變量 - objectId是我唯一需要的。我可能可以做得更清楚一點,對不起。 – Alastair

相關問題