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

本文关键字:对象 Silverlight 反序列化 json 字符串 | 更新日期: 2023-09-27 18:30:44

今天下午我花了很长时间尝试在字符串中实现 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,
             }
}

并将其放在以下对象中(字典中的双精度是必需的):

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"。

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

谢谢你的时间!

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

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

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

我不太确定你需要使用StreamReader,你到底用什么?

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

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

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

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

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

根据您的例外:(一个简单的谷歌搜索拉出了这个答案)

您的项目似乎引用了旧版本的 Silverlight 运行时。

若要进行检查,请在 Visual Studio 中调出项目属性,并确保 Silverlight 版本设置为 4.0。

您可能还需要仔细检查 System.Windows.Controls.Navigation 程序集,确保它引用的最新版本通常位于 [程序文件]''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,要么需要手动设置此特定片段的反序列化以填充字典。