如何从Google API获取JSON数据并将其存储在变量中?

3

我正在尝试向Google位置Api发送Http Get消息,该消息应该具有类似于以下内容的Json数据

https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt 正如您所注意到的那样,响应以Json格式返回。我想给那个URL发出Http调用,并将Json内容保存在变量或字符串中。我的代码没有出现任何错误,但也没有返回任何内容。

public async System.Threading.Tasks.Task<ActionResult> GetRequest()
{
    var client = new HttpClient();

    HttpResponseMessage response = await  client.GetAsync("https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt");
    string data = response.Content.ToString();
    return data;
}

我想使用HttpClient()或任何能够发送URL请求并将内容保存到字符串变量中的方法来发送Get请求。如果有建议,将不胜感激。再次说明,我的代码没有错误,但它没有返回任何内容。


这个请求是来自哪种类型的应用程序?这对答案有很大影响。 - Adam Carr
这是一个MVC4应用程序,我基本上是在控制器操作提交时进行调用。我会在上面发布更多的代码。 - Ignacio Hernandez
按照 API 的树形结构进行操作,例如要获取 long_name,需要编写 results.adress_components.long_name。 - Kob_24
5个回答

1
使用ReadAsStringAsync方法来获取JSON响应...
static void Main(string[] args)
{
    HttpClient client = new HttpClient();
    Task.Run(async () =>
    {
        HttpResponseMessage response = await client.GetAsync("https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt");
        string responseString = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseString);
    });
    Console.ReadLine();
}

如果您使用 response.Content.ToString(),它实际上会将 Content 的数据类型转换为字符串,因此您将获得 System.Net.Http.StreamContent

0

使用由Newtonsoft提供的.NET Json框架Json framework如何?您可以尝试将内容解析为字符串。


虽然这理论上回答了问题,但最好在此处包含答案的基本部分,并提供参考链接。 - Raju

0

试试这个。

        var client = new HttpClient();
        HttpResponseMessage httpResponse = await client.GetAsync("https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt");
        string data = await httpResponse.Content.ReadAsStringAsync();

0

嗯,你的代码可以简化:

public async Task<ActionResult> GetRequest()
{
  var client = new HttpClient();
  return await client.GetStringAsync("https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt");
}

然而...

我的代码没有报错,但也没有返回任何内容

这几乎肯定是由于在调用堆栈的更高位置使用了 ResultWait 像那样阻塞异步代码会导致死锁,我在我的博客上对此进行了全面解释。简而言之,存在一个ASP.NET请求上下文,只允许一次一个线程;默认情况下,await将捕获当前上下文并在该上下文中恢复;而由于Wait/Result阻塞了一个线程请求上下文中,await无法继续执行。


-1

试试这个

public async static Task<string> Something()
    {            
        var http = new HttpClient();
        var url = "https://maps.googleapis.com/maps/api/geocode/json?address=Los%20Angeles,CA=AIzaSyDABt";
        var response = await http.GetAsync(url);
        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            result = JsonConvert.DeserializeObject<string>(result);
            return result;
        }
        return "";
    }

var result = Task.Run(() => Something()).Result;

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