2016-03-03 89 views
0

我想在我的Windows窗體應用程序中反序列化一些Json。我嘗試使用的代碼與其他迭代中使用的代碼相同,使用不同的Json和對象。雖然試圖找出我偶然發現了一些我認爲可以應用於我的情況的非常基本的代碼。因此,在另一個項目,這是一個控制檯應用程序,我粘貼下面的代碼:JsonConvert.DeserializeObject在一個項目中工作,但在另一個項目中不工作

string json = @"{'Id': 1, 'Name': 'biofractal'}"; 
var results = JsonConvert.DeserializeObject<dynamic>(json); 
Console.WriteLine(results.Id); 

這在控制檯應用程序工作正常,但是當我在我的第一個應用程序發佈它,它會導致異常。

拋出異常: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' 在 Microsoft.CSharp.dll

Newtonsoft.Json.Linq.JObject不包含定義標識

我檢查了多次,並使用完全相同的代碼,並且在文件的開頭添加了using Newtonsoft.Json。我搜索了四周,並聽到提及清除GAC緩存或沿着這些線,但我似乎無法找到正確的文件。

回答

1

這幾乎肯定與動態的使用有關。

解決上述問題的最簡單的方法是不使用動態類型和定義你的代碼的對象相匹配的JSON如下:

class MyClass { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

然後使用這個類型的deserialisation:

var results = JsonConvert.DeserializeObject<MyClass>(json); 

動態關鍵字可以使用匿名類型時deserialisation導致問題 - 這篇文章解釋了它相當不錯: Anonymous Types are Internal。這可能是你得到RuntimeBindingException的原因。

+0

['JObject'](http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JObject.htm)不是匿名類型;它是由Json.Net公開的公共和知名類型。 –

+0

的確,但它沒有Id屬性。序列化創建一個JObject的事實表明動態變量沒有正確綁定 - 鏈接更多的是背景信息,而不是這個特定情況的答案。如果有針對這種情況的答案,那麼看起來會很有趣。 –

+0

是的,我意識到這可能是一個更好的方式來處理這個特定的情況,但在我的第一個程序的情況下,Json是一個更復雜,我不得不做更多的課程。主要問題是,我發佈的代碼實際上在一個項目中工作,但不在另一個項目中,所以從技術上講,它應該在任何項目中工作,對吧? –

相關問題