3

今天下午我花了很长时间尝试在字符串中实现 JSON 的反序列化,起初我使用DataContractJsonSerializer因为我的环境是 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());

但这会导致以下异常:

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

根据你所看到的,我的方法是完全错误的,还是我只是犯了一个小学生的错误(或两者兼而有之!)

谢谢你的时间!

4

3 回答 3

1

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

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

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

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

于 2012-04-11T23:31:28.590 回答
1

异常消息本身似乎是此 SO 问题中提出的已知问题:

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

在使用 Nuget 安装具有所有必要依赖项的最新包后(我之前从 CodePlex 项目手动下载了 .DLL),代码无需额外更改即可工作。

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

于 2012-04-12T08:03:54.317 回答
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 中不是一个 Array,它是一个对象。一个数组看起来像:

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

因此,要么你必须让源正确地格式化它的 JSON,要么你需要手动设置这个特定片段的反序列化来填充字典。

于 2012-04-12T00:25:01.347 回答