【问题标题】:Getting JSON string from URL in Windows Phone 8从 Windows Phone 8 中的 URL 获取 JSON 字符串
【发布时间】:2014-10-01 22:13:51
【问题描述】:

所以我试图从 windows phone 8 应用程序中的 Url 获取 Json 字符串。 我只需要调用一个返回此字符串的回调 URL,就差不多了,但不知怎的,我已经坚持了好几天了,我只是不明白该怎么做

我有一个 urlparser 类,其中包含 2 个方法:

public void ParseJsonUrl(string url)
    {
        Uri uri = new Uri(url);
        WebClient webClient = new WebClient();
        webClient.DownloadStringCompleted += webClient_DownloadStringCompleted;
        webClient.DownloadStringAsync(uri);
    }

    void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        var jsonData = JsonConvert.DeserializeObject<parameter>(e.Result);
        Debug.WriteLine(jsonData.parameter1);
    }

现在我只是尝试显示我的 Json 字符串中包含的参数之一,当然,一旦我开始工作,我的方法将执行其他操作

我的 urlparser.cs 文件开头有一个名为“parameters”的类,看起来像

public class parameter
{
    public string parameter1 { get; set; }
    public string parameter2 { get; set; }
    public string parameter3 { get; set; }
}

但这不起作用...我收到此错误

'System.Reflection.TargetInvocationException'

我按照这个教程http://blogs.msdn.com/b/pakistan/archive/2013/06/23/10425845.aspx 并看到许多其他几乎相同的东西,但不幸的是,这不起作用。在某些教程中,他们使用“DownloadString”而不是“DownloadStringAsync”,但我不能调用此方法(WP8 可能不可用),在其他一些教程中,他们在方法中使用“await”,但我不明白我在哪里应该放置“等待”语句以及我应该添加哪些其他代码

此外,一旦我能够在我的 var 中获取我的 json 数据,如果有人能告诉我如何从另一个类中访问它,那就太好了!

谢谢!

【问题讨论】:

  • 糟糕忘记了,我马上补上
  • 试着看看 InnerException 说了什么
  • 我认为 DownloadStringAsync 如果你只是 await 会返回字符串。
  • 可能在元素完全加载之前引发
  • 那么我能做的最好的事情是什么?用 await 实现它?或者尝试另一种方式?如果是这样,如何完全实现异步方法?我在“public”之后添加“async”,然后在 webClient.DownloadStringAsync 之前添加“await”?但这是一个无效的方法,所以我不能等待它......我知道我可能不清楚,但我几乎不明白这是如何工作的

标签: c# json windows-phone-8 webclient webclient-download


【解决方案1】:

确保从 WebClient 接收到的 json 文件的结构与您解析的类结构相似,即

{
“范围”: {
"参数1": "somestring1",
"参数2": "somestring2",
“parameter3”:“somestring3”
}
}

否则你需要创建一个类似于你收到的 json 格式的类结构。

或者,您可以从 json 创建一个 JObject 并通过键访问值(参见此处:http://james.newtonking.com/json/help/?topic=html/LINQtoJSON.htm

【讨论】:

  • 您可以查看此站点:Json2CSharp。它需要一个 json 字符串并创建类似的类结构,您可以将其与 JsonConvert.DeserializeObject 一起使用。用你的 json 响应试试这个网站,看看你的类结构是否相似。
【解决方案2】:

首先你需要看看你的参数类会是什么样子,你可以通过像here这样的“json to class”应用程序来插入链接,应用程序会生成参数类应该是什么样子,请注意,有时您必须手动解析 json,并且请检查您的互联网连接。

【讨论】:

  • 我试过了,我可以看到我的课程不是它必须的样子,但是即使有了新课程我仍然得到'System.Reflection.TargetInvocationException'......跨度>
【解决方案3】:

所以,在弄清楚问题出在哪里之后,我想如果有一天有人遇到同样的问题,我会回答这个问题。 问题是,我的“ParseJsonUrl”函数中有一些代码在该行之后

webClient.DownloadStringAsync(uri);

这就是问题所在。此外,ParseJsonUrl 由按钮调用的函数调用,在调用之后,该函数还执行其他调用,按钮也执行。

所有这些调用都会导致在执行按钮调用的所有操作之前永远不会下载字符串,并且在此之前我需要字符串。

解决方案是在调用我的 UrlParser.ParseJsonUrl 函数的类中创建 DownloadStringCompleted 方法,并在其参数中将该事件传递给该函数。

然后,需要通过按钮单击执行的所有操作都设置在那个 DownloadStringCompleted 方法中

它在代码中的样子:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        MyClass myClass = new MyClass();
        myClass.Function(url); // Assuming url is already set somewhere
    }

然后在 MyClass 中

public string Function(string url)
    {
        this.url = url;
        URLParser parser = new URLParser();
        parser.ParseJsonUrl(url, new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted ));
    }

void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
       //Everything you need to be performed once the string is downloaded
    }

最后在 UrlParser 类中

public void ParseJsonUrl(string url, DownloadStringCompletedEventHandler handler)
    {
        Uri uri = new Uri(url);
        WebClient webClient = new WebClient();
        webClient.DownloadStringCompleted += handler;
        webClient.DownloadStringAsync(uri);
    }

希望有一天这对某人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多