我今天下午花了很长时间尝试在字符串中实现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'类型。
基于你可以看到的是我的方法完全错误,或者我只是犯了一个小学生错误(或两者兼而有之!)
谢谢你的时间!
答案 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,或者您需要手动设置此特定部分的反序列化以填充字典。