【问题标题】:Make Http Request to Api and Convert to json向 Api 发出 Http 请求并转换为 json
【发布时间】:2018-01-20 22:55:31
【问题描述】:

我的问题可能是微不足道的,但我已经花了将近 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# 努力实现的全部,任何帮助完成代码或解释。谢谢

【问题讨论】:

    标签: c# request dotnet-httpclient


    【解决方案1】:

    尝试使用这样的东西:

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

    来自评论

    然后我明白了 "{\"凭证\":[\"UN9NKK\",\"FYMFVS\",\"WV5AX7\",\"M2TJJ8\",‌​\"FBB9AL\",\"MBW8Z4\‌​"]} "

    你可以新建一个类

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

    然后

    var response = JsonConvert.DeserializeObject<MyResponse>(content); 
    foreach(var item in response.Vouchers){
         Console.WriteLine(item);
    }
    

    【讨论】:

    • 我试过这个,我得到了这个错误.. JsonSerializationException: 无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.IList`1 [System.Object]' 因为该类型需要 JSON 数组(例如 [1,2,3])才能正确反序列化。要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或将反序列化类型更改为正常的 .NET 类型(可以从 JSON 对象反序列化。JsonObjectAttribute 也可以是添加到类型以强制其反序列化
    • 它实际上在反序列化行中断
    • 好的,预期的响应是什么?正如我从您的代码中看到的,您期望 Json 带有对象数组
    • object.. 但是当我 readStringAsync 将响应转换为字符串时。然后我得到这个带有转义字符的"{\"vouchers\":[\"UN9NKK\",\"FYMFVS\",\"WV5AX7\",\"M2TJJ8\",\"FBB9AL\",\"MBW8Z4\"]}" ,所以反序列化无法解析转义字符......
    【解决方案2】:

    如果您不介意小型库依赖项,Flurl(免责声明:我是作者)让您在 C# 中获得 Python 的简单性:

    var data = await apiUrl.GetJsonAsync();
    

    在这种情况下,data 是 C# dynamic 类型,这意味着您可以通过名称访问所有 J​​SON 对象的属性,而无需定义相应的 C# 类,就像无类型语言一样。如果您确实想声明一个类并获得编译时类型检查,那么 Flurl 也可以:

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

    现在dataMyClass 的实例,而不是动态的。

    Get Flurl.Http on Nuget,并使用using Flurl.Http; 引用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多