C# 从Windows Phone 8中的URL获取JSON字符串

C# 从Windows Phone 8中的URL获取JSON字符串,c#,json,windows-phone-8,webclient,webclient-download,C#,Json,Windows Phone 8,Webclient,Webclient Download,因此,我试图从WindowsPhone8应用程序中的Url获取Json字符串。 我只需要调用一个返回这个字符串的回调URL,差不多就是这样,但不知怎么的,我已经在这上面呆了好几天了,我不知道怎么做 我有一个urlparser类,它包含两个方法: public void ParseJsonUrl(string url) { Uri uri = new Uri(url); WebClient webClient = new WebClient();

因此,我试图从WindowsPhone8应用程序中的Url获取Json字符串。 我只需要调用一个返回这个字符串的回调URL,差不多就是这样,但不知怎么的,我已经在这上面呆了好几天了,我不知道怎么做

我有一个urlparser类,它包含两个方法:

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);
    }
但这不起作用。。。我得到这个错误

“System.Reflection.TargetException”

我遵循了这个教程 看到了很多几乎相同的东西,但不幸的是,这不起作用。在一些教程中,他们使用“DownloadString”而不是“DownloadStringAsync”,但我不能调用此方法(可能不适用于WP8),而在一些其他教程中,他们在方法中使用“await”,但我不明白应该将“await”语句放在哪里,以及应该添加哪些其他代码

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


谢谢

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

{
“参数”: {
“参数1”:“somestring1”,
“参数2”:“somestring2”,
“参数3”:“somestring3”
}
}

否则,您需要创建一个类似于您正在接收的json格式的类结构


或者,您可以从json创建JObject并通过键访问值(请参见此处:)

首先,您需要了解您的参数类是什么样子的,您可以通过“json到类”应用程序这样做,插入链接,应用程序生成参数类应该是什么样子,请注意,有时您必须手动解析json,还请检查您的internet连接

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

webClient.DownloadStringAsync(uri);
这就是问题所在。此外,ParseJsonUrl由一个按钮调用的函数调用,在该调用之后,该函数还执行其他调用,按钮也执行其他调用

所有这些调用都导致了这样一个事实,在按钮调用的所有内容都被执行之前,字符串永远不会被下载,而在此之前我需要字符串

解决方案是在调用my 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
    }
然后在我的课堂上

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);
    }

希望有一天这能帮助别人

Oops忘了它,我会马上添加它,看看InnerException说什么我认为
DownloadStringAsync
返回字符串,如果你只是
等待它。可能在元素完全加载之前引发。那么我能做的最好的事情是什么?用等待来实现它?或者尝试另一种方式?如果是这样,如何完全实现异步方法?我在“public”之后加上“async”,然后在webClient.DownloadStringAsync之前加上“wait”?但这是一个无效的方法,所以我不能等待它。。。我知道我可能不清楚,但我不太明白这是怎么回事我试过了,我可以看到我的类不是它必须的样子,但是即使有了新类,我仍然得到了“System.Reflection.TargetInvocationException”…你可以查看这个网站:。它接受一个json字符串,并创建类似的类结构,可用于
JsonConvert.DeserializeObject
。使用json响应尝试此站点,看看您的类结构是否相似。
public void ParseJsonUrl(string url, DownloadStringCompletedEventHandler handler)
    {
        Uri uri = new Uri(url);
        WebClient webClient = new WebClient();
        webClient.DownloadStringCompleted += handler;
        webClient.DownloadStringAsync(uri);
    }