【问题标题】:Deserializing json string into an object - Silverlight将 json 字符串反序列化为对象 - Silverlight
【发布时间】:2012-04-24 07:14:38
【问题描述】:

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

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

感谢您的宝贵时间!

【问题讨论】:

    标签: c# json silverlight-4.0 dictionary json.net


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 据我了解,JavaScriptSerializer 在 Silverlight 中不可用(如我的问题中所述),这就是为什么使用 JSON.NET - 如果有任何替代方案,我愿意接受。另外 args.Result 是一个 Stream。
    【解决方案2】:

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

    Moving to JSON.NET 4.0.3 broke my app

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

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

    【讨论】:

      【解决方案3】:

      根据你的例外:(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 中不是一个 Array,它是一个对象。数组看起来像:

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

      因此,要么您必须获取源以正确格式化它的 JSON,要么您需要手动设置此特定片段的反序列化以填充字典。

      【讨论】:

      • 这是由于使用 .DLL 时出现的问题(并且已在更高版本中得到纠正)。使用我在问题中发布的代码,JSON 被正确反序列化,包括费率。无论哪种方式,谢谢您的回答。
      猜你喜欢
      • 1970-01-01
      • 2014-01-04
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2012-07-18
      • 1970-01-01
      相关资源
      最近更新 更多