将json字符串反序列化为对象 - Silverlight

时间:2012-04-11 22:57:21

标签: c# json silverlight-4.0 dictionary json.net

我今天下午花了很长时间尝试在字符串中实现JSON的反序列化,起初我使用的是 DataContractJsonSerializer ,因为我的环境是Silverlight,但它似乎不支持使用开箱即用的词典(在许多其他SO问题中提出)。

作为替代方案,我决定暂时使用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,
             }
}

并将其放在以下对象中(需要字典中的double):

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());

但这导致以下异常:

无法从程序集'System.Core,Version = 3.7.0.0,Culture = neutral,PublicKeyToken = 969DB8053D3322AC'加载'System.Dynamic.IDynamicMetaObjectProvider'类型。

基于你可以看到的是我的方法完全错误,或者我只是犯了一个小学生错误(或两者兼而有之!)

谢谢你的时间!

3 个答案:

答案 0 :(得分:1)

我认为这会对你有所帮助:

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

我不确定你需要使用StreamReader,你还用它做什么?

顺便说一下,我假设args.Result是json string。

答案 1 :(得分:1)

异常消息本身似乎是在这个SO问题中提出的一个已知问题:

Moving to JSON.NET 4.0.3 broke my app

使用Nuget安装具有所有必要依赖项的最新软件包(我之前从CodePlex项目手动下载了.DLL)后,代码无需进行其他更改。

感谢提供解决方案的用户。

答案 2 :(得分: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,或者您需要手动设置此特定部分的反序列化以填充字典。