2012-04-11 132 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

相关问题