2012-12-03 58 views
37

我使用Newtonsoft JSON庫執行傳入生JSON動態deserialisation和發現的東西,我只是無法解釋。Newtonsoft JSON - 動態對象

的出發點是下面的JSON字符串:

{ 
    "task": { 
    "dueDate": "2012-12-03T00:00:00" 
    } 
} 

沒有什麼太複雜的有...

在代碼中,我再這樣做:

var dyn = JsonConvert.DeserializeObject<dynamic>(rawJson); 
DateTime dueDate = dyn.task.dueDate.Value; 

此代碼已被在幾個月的地方,並且工作正常,但是在最近的測試版本中,我們看到以下錯誤:

'Newtonsoft.Json.Linq.JObject' does not contain a definition for 'task'

Stack Trace: at CallSite.Target(Closure , CallSite , Object) at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)

現在,這是在得到奇,一切開始如果我從上面修改代碼重新工作:

DateTime dueDate = dyn.task.dueDate.Value; 

DateTime dueDate = dyn["task"]["dueDate"].Value; 

所以,雖然這是「固定」我不明白爲什麼會修復它,以及可能的原因是什麼。沒有任何人有任何想法

+0

您是否更改了您使用的Json.NET版本? –

+0

不,這是我的第一個想法 - 查看代碼和庫上的更改歷史記錄顯示沒有更改生活中(和工作)的內容 – MrEyes

+4

您確定這不是「第一次機會異常」動態(也許你有錯誤登錄等增加細節水平)? – tpeczek

回答

41

你可以試試這個:

dynamic task = JObject.Parse(rawJson); 

文檔:Querying JSON with dynamic

+0

這個工程很好,想知道爲什麼它不是被接受的答案。 – Saturnix

+11

因爲他要求瞭解爲什麼它在提供的示例中不起作用,因爲它*應該*用於提供的示例。 –

+1

這沒有解決它對我來說,同樣的錯誤。 – Ted

1

這肯定是一些參考的問題,我只是有同樣的問題,原來的問題是,我不得不補充包文件夾到項目,這樣我可以在VSS檢查(對不起,強制性的),只要我刪除從Visual Studio中的包的文件夾,它開始工作的罰款

+2

VSS ...哎呀!很抱歉聽到這個消息。 –

1

我有同樣的問題與應用ü唱Json.NET。這個問題僅在一臺特定的機器上覆發,事實證明該機器在GAC中安裝了另一個版本的Json.NET。從GAC中移除後,應用程序開始正常工作。

+0

這對我來說也是同樣的問題! –

5

在我的情況下,它變成了我被抓住第一次機會異常,所以雖然這個異常被拋出它不是,事實上,我的防止代碼執行。

它仍然將是不錯的知道爲什麼會這樣由Json.NET反序列化的一些內容,但不是全部內容。例如,我有一個動態對象,我在單元測試中用json.net序列化,然後反序列化序列化的內容。序列化的內容看起來與在運行時引發運行時綁定器異常的內容相同。

4

我有同樣的問題。

Json.NET 6.0.4導致此issue.You應將其更改爲Json.Net 6.0.5。 沒有任何項目應該參考Json.NET 6.0.4。

轉到工具 - > NuGet包管理器 - >管理NuGet包解決方案... 並檢查,如果任何項目使用Json.NET 6.0.4,修復它們。

+0

爲了記錄,與Json.NET 6.0.3相同的問題。修復了最新版本7.0.1。 –

+2

作爲一個有趣的旁白,我下載了Newtonsoft.JSON源文件,並在「任務」上進行了搜索。 OP的確切原始JSON是在測試方法中輸入的......誰知道爲什麼發生這種情況,但Newtonsoft中的某個人正在閱讀此內容。看起來底線是這是(或者是)庫的錯誤。 – RLH

+0

我在v 7.0.0.0中有這個問題,好像... – Ted

1

我有這個問題了一會兒怎麼回事,原來,使用的DLL被編譯爲.NET 3.5這不支持動態....確保您的DLL編譯爲.NET 4。5及以上