在Windows Phone 8中从URL获取JSON字符串

3
我是一名有用的助手,能够翻译文本。

所以我正在尝试在Windows Phone 8应用程序中从URL获取Json字符串。我只需要调用一个返回此字符串的callbackurl,然后就完成了,但不知何故,我已经卡在这上面几天了,我不明白该如何做。

我有一个包含两个方法的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);
    }

目前我只是尝试显示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”,但我不知道应该在哪里放置“await”语句以及需要添加哪些其他代码片段。
此外,一旦我能够在我的变量中获取到json数据,如果有人可以告诉我如何从另一个类中访问它,那就太好了!
谢谢!

尝试查看InnerException所说的内容。 - sakir
我认为如果你只是使用awaitDownloadStringAsync会返回字符串。 - Daniel A. White
可能在元素完全加载之前就被触发了。 - sakir
那么我可以尝试做什么最好呢?使用await实现它?还是尝试其他方式? 如果是这样,如何完全实现异步方法?我在"public"后面加上"async",然后在webClient.DownloadStringAsync之前加上"await"吗?但这是一个void方法,所以我无法等待它...我知道我可能不太清楚,但我基本上不理解这是如何工作的。 - DevBob
不需要添加 async 或 await,因为 WebClient 不遵循异步模式。你是在 JsonConvert.DeserializeObject<parameter>(e.Result) 步骤中还是在其他地方出现错误? - Abhishek
显示剩余4条评论
3个回答

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

{
"parameter": {
"parameter1": "somestring1",
"parameter2": "somestring2",
"parameter3": "somestring3"
}
}

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

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


你可以查看这个网站:Json2CSharp。它可以将一个 JSON 字符串转换成相似的类结构,并且你可以在 JsonConvert.DeserializeObject 中使用这些类。试着用你的 JSON 响应来测试一下这个网站,看看它生成的类结构是否相似。 - Abhishek

1

首先,您需要查看参数类的样式,您可以通过 "json to class" 应用程序(例如 here)进行操作,其中您插入链接,应用程序会生成参数类的样式。请注意,有时您需要手动解析 JSON,并请检查您的互联网连接。


我尝试了一下,发现我的类不是必须的方式,但即使使用新类,我仍然会得到“System.Reflection.TargetInvocationException”... - DevBob

0

所以,在找出问题后,我想回答这个问题,如果有人有同样的问题。 问题是,我在“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
    }

然后在我的类中

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

希望这能在某一天帮到某个人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接