【问题标题】:Windows Phone 7 App Quits when I attempt to deserialize JSON当我尝试反序列化 JSON 时,Windows Phone 7 应用程序退出
【发布时间】:2010-08-05 17:34:35
【问题描述】:

我正在开发我的第一个 Windows Phone 7 应用程序,但遇到了障碍。基本上它只是读取一个 json 事件字符串并将其绑定到一个列表(使用列表应用程序起点)

public void Load()
{
    // form the URI
    UriBuilder uri = new UriBuilder("http://mysite.com/events.json");

        WebClient proxy = new WebClient();  
    proxy.OpenReadCompleted += new OpenReadCompletedEventHandler(OnReadCompleted);  
    proxy.OpenReadAsync(uri.Uri);  
}

void OnReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error == null)
    {
        var serializer = new DataContractJsonSerializer(typeof(EventList));
        var events = (EventList)serializer.ReadObject(e.Result);
        foreach (var ev in events)
        {
            Items.Add(ev);
        }
    }
}

public ObservableCollection<EventDetails> Items { get; private set; }

EventDetails 是我包装 json 字符串的类。这个类必须是正确的,因为它是该网站内部使用的类的精确副本,从中生成 json...

我从 webclient 调用中正确获取了 json 字符串(我读取了内存流并且 json 确实存在)但是一旦我尝试反序列化字符串,应用程序就会退出并且调试器停止。

我没有收到任何错误消息或任何表明发生任何事情的迹象,它只是停止了。如果我也在监视窗口中键入反序列化方法,就会发生这种情况......

我已经尝试过使用 JSON.net,实际上我认为这可能是 JSON.net 的问题,所以我将其转换为使用 .net 框架中的本机反序列化器,但无论哪种方式,错误都是一样的。

为什么应用程序会退出?它不应该给我一些错误信息吗?

我做错了什么?

非常感谢!

【问题讨论】:

  • 尝试更改调试设置以抛出所有异常 - 我在发出 Web 请求时有一些异常被静默抛出。
  • 你能告诉我我在哪里做这个改变吗?谢谢!
  • ctrl + alt + e 然后选择例外

标签: silverlight json serialization windows-phone-7


【解决方案1】:

首先,你有一些看起来像 JSON 的字符串并不意味着你有一个有效的 JSON。尝试转换一个简单的。

如果您的 JSON 有效,则可能是您的 JSON 实现不知道如何将列表转换为 EventList。改用ArrayList 试试看,然后告诉我。

【讨论】:

  • 感谢您的回复!我确信 JSON 是有效的,因为它与网站内用于反序列化为相同 eventdetails 类的 json 相同。但我相信你是对的,它必须与映射有关,因为如果我手动执行它,创建一个 EventList 类并解析 json 中的每个值它可以工作并且不会崩溃......但我没有就这样它就关闭了。这对任何人都没有帮助!!再次感谢
【解决方案2】:

应用程序因发生未处理的异常而关闭。如果检查 App.xaml.cs 文件,您将找到关闭应用程序的代码。您需要做的是尝试捕获您的反序列化过程并在本地处理它。所以很可能你有一些 DataContractJsonSerializer 不喜欢的 JSON。我在反序列化 WCF JSON 时遇到了问题,不得不走其他路线。

您可能需要检查以确保您的 JSON 有效,仅仅因为您的网站喜欢它并不意味着它实际上是有效的,您网站上的代码可能有助于纠正问题。将您的 JSON 对象(字符串)的副本放入 http://jsonlint.com/ 以查看它是否有效。 Crokford(创建 JSON 的人)写了这个网站来验证 JSON,所以我会比你的网站更依赖它;)这个小网站在过去一年里确实帮助我解决了一些问题。

【讨论】:

    【解决方案3】:

    我在尝试迁移一些现有的 WM 代码以在 WP7 上运行时遇到了同样的问题。我相信 WP7 应用程序在加载引用了 WP7 中不可用的东西的程序集(或类?)时会崩溃。就我而言,我认为它是 Assembly.Load 或 System.IO 命名空间中的东西,与通过路径访问文件有关。

    虽然您的情况可能完全不同,但症状完全相同。

    我唯一可以推荐的是浏览 JSON 库,看看它是否引用了 WP7 中不允许的基类。请注意,它甚至不必点击导致问题的代码行 - 只要它尝试点击包含错误引用的类,它就会崩溃。

    如果您可以进入 JSON 库,您可以更好地了解是哪个类导致了问题,因为一旦代码引用它,整个应用程序就会崩溃并且调试器将停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多