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

3
我今天下午花了很长时间尝试在字符串中实现JSON反序列化,一开始我使用的是,因为我的环境是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,
             }
}

将其放置在以下对象中(字典内的两个双引号是必需的):

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个回答

1

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

移动到JSON.NET 4.0.3破坏了我的应用程序

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

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


1

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

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

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

顺便说一下,我假设args.Result是JSON字符串。


据我所知,在Silverlight中JavaScriptSerializer不可用(如我的问题所述),这就是为什么我在使用JSON.NET - 如果有任何替代方案,我很乐意尝试。此外,args.Result是一个流。 - Jamie Keeling

0

根据您的异常: (一个简单的谷歌搜索引出了这个答案)

看起来你的项目正在引用较旧版本的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,要么需要手动设置反序列化以填充字典。


这是由于使用.DLL的问题(并且在后续版本中已经得到纠正)。使用我在问题中发布的代码,JSON被正确反序列化,包括汇率。无论如何,感谢您的回答。 - Jamie Keeling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接