代码之家  ›  专栏  ›  技术社区  ›  saviour123

向Api发出Http请求并转换为json

  •  1
  • saviour123  · 技术社区  · 6 年前

    我的问题可能很琐碎,但我已经花了将近6个小时来尝试。

    public async Task<object> save() 
    {
        var uri = "https://newsapi.org/v1/articles?source=talksport&apiKey=longKey";
        var httpClient = new HttpClient ();
        HttpResponseMessage res = await httpClient.GetAsync(uri);
        var data = await res.Content.ReadAsStreamAsync();
    
        // this is what I want to achieve like in python you can do something like this
        foreach(var item in data){
            Console.writeline(item.summary);
        }
        // end of arbitrary code
        return data;
    }
    

    我的问题是,我无法进行此转换以获取响应,然后访问json数据。 在python中,您可以做一些事情

    r = request.get(apiUrl)
    data = r.json()
    for item in data:
       print(item.summary)
    

    这就是我用c#努力实现的全部内容,任何帮助都可以完成代码或解释。谢谢

    2 回复  |  直到 6 年前
        1
  •  3
  •   Roman Marusyk S Kotra    6 年前

    尝试使用以下内容:

    安装 Newtonsoft.Json 打包并添加 using Newtonsoft.Json;

    using (var request = new HttpRequestMessage()) {
        request.RequestUri = new Uri("https://newsapi.org/v1/articles?source=talksport&apiKey=longKey");
        request.Method = HttpMethod.Get;
    
        using (var response = await httpClient.SendAsync(request)) {
            string content = await response.Content.ReadAsStringAsync();
    
            var result = JsonConvert.DeserializeObject<IList<dynamic>>(content);
    
            foreach(var item in result){
               Console.writeline(item.summary);
            }
        }
    }
    

    来自评论

    然后我得到这个

    您可以创建一个新类

    public class MyResponse { 
       public IEnumerable<string> Vouchers {get;set; } 
    } 
    

    然后

    var response = JsonConvert.DeserializeObject<MyResponse>(content); 
    foreach(var item in response.Vouchers){
         Console.WriteLine(item);
    }
    
        2
  •  1
  •   Todd Menier    6 年前

    如果您不介意对库的依赖性很小, Flurl (免责声明:我是作者)让您了解C语言中Python的简单性:

    var data = await apiUrl.GetJsonAsync();
    

    在这种情况下, data 是C# dynamic 类型,这意味着您可以按名称访问JSON对象的所有属性,而无需定义相应的C#类,就像非类型化语言一样。如果您确实想声明一个类并进行编译时类型检查,这也适用于Flurl:

    var data = await apiUrl.GetJsonAsync<MyClass>();
    

    现在 数据 是的实例 MyClass 而不是动态。

    Get Flurl.Http on Nuget using Flurl.Http; .