2012-04-11 138 views
3

我今天下午花了很長時間嘗試在字符串中實現JSON的反序列化,起初我使用的是DataContractJsonSerializer,因爲我的環境是Silverlight,但它似乎並不支持使用字典開箱即用(引發了許多其他SO問題)。將json字符串反序列化爲一個對象Silverlight

作爲一種選擇,我決定暫時使用JSON.NET(基於上述SO問題的答案),並且遇到以下問題。

我想反序列化下面的JSON:

{ 
    "disclaimer": "This data is collected from various providers and provided free of charge for informational purposes only, with no guarantee whatsoever of accuracy, validity, availability or fitness for any purpose; use at your own risk. Other than that - have fun, and please share/watch/fork if you think data like this should be free!", 
    "license": "Data collected from various providers with public-facing APIs; copyright may apply; not for resale; no warranties given.", 
    "timestamp": 1334183999, 
    "base": "USD", 
    "rates": { 
       "AED": 3.6732, 
       "AFN": 48.400002, 
       "ALL": 106.669998, 
      } 
} 

,並把它下面的對象(字典中的雙重要求)中:在實際上得到這個

public class ExchangeData 
{ 
    public string disclaimer { get; set; } 
    public string license { get; set; } 
    public string timestamp { get; set; } 
    public string @base { get; set; } 
    public Dictionary<string, double> rates { get; set; } 
} 

我的最新嘗試工作如下:

StreamReader reader = new StreamReader(args.Result); 
ExchangeData data = JsonConvert.DeserializeObject<ExchangeData>(reader.ReadToEnd()); 

但是,這導致下面的例外on:

無法從程序集「System.Core,Version = 3.7.0.0,Culture = neutral,PublicKeyToken = 969DB8053D3322AC'中加載類型'System.Dynamic.IDynamicMetaObjectProvider'。

根據你看到的是我的做法完全錯誤還是我只是讓一個學生的錯誤(或兩者)

感謝您的時間!

回答

1

異常消息本身似乎是在這太問題提出了一個著名的問題:

Moving to JSON.NET 4.0.3 broke my app

使用的NuGet與所有必要的依賴安裝最新的包後(我手動下載了.DLL的距離之前的CodePlex項目)代碼工作沒有額外的變化。

非常感謝提供解決方案的用戶。

1

我認爲這將幫助您:

JavaScriptSerializer ser = new JavaScriptSerializer(); 
ExchangeData foo = ser.Deserialize<ExchangeData>(args.Result); 

我真的不知道你需要使用的StreamReader,你怎麼使用它呢?

順便說一句,我假設args.Result是json字符串。

+0

從我所瞭解的JavaScriptSerializer在Silverlight中不可用(正如我的問題中提到的),這就是爲什麼在使用JSON.NET時 - 如果有任何替代方法,我願意接受。另外args.Result是一個Stream。 – 2012-04-12 00:02:04

0

根據您的例外:(a simple google search pulled up this answer

好像你的項目引用舊版本的Silverlight運行時。

要檢查,請在Visual Studio中調出項目屬性,並確保Silverlight版本設置爲4.0。

您可能還想重新檢查System.Windows.Controls.Navigation程序集,確保它引用的是通常位於[Program Files] \ Microsoft SDKs \ Silverlight \ v4.0 \ Libraries \ Client \ System.Windows.Controls.Navigation.dll

及以下:

"rates": { 
      "AED": 3.6732, 
      "AFN": 48.400002, 
      "ALL": 106.669998, 
     } 

是不是在JSON,數組,它是一個對象。數組看起來像:

"rates": [ 
      "AED": 3.6732, 
      "AFN": 48.400002, 
      "ALL": 106.669998, 
     ] 

因此,無論你有獲得源正確格式是JSON,或者您需要手動設置反序列化這一特定一塊來填充字典。

+0

這是由於使用.DLL的問題(並且已經在更高版本中糾正)。使用我在問題中發佈的代碼,JSON被正確反序列化,包括費率。謝謝你的回答。 – 2012-04-12 08:05:20

相關問題