【问题标题】:How to get data from json api with c# using httpwebrequest?如何使用 c# 使用 httpwebrequest 从 json api 获取数据?
【发布时间】:2017-11-30 05:36:37
【问题描述】:

我想在我的 c# 控制台应用程序中从 https://api.coinmarketcap.com/v1/ticker/ 获取所有变量。 我该怎么做?

我首先将整个页面作为一个流。现在该怎么办?

private static void start_get()
{
    HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create
        (string.Format("https://api.coinmarketcap.com/v1/ticker/"));

    WebReq.Method = "GET";

    HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();

    Console.WriteLine(WebResp.StatusCode);
    Console.WriteLine(WebResp.Server);

    Stream Answer = WebResp.GetResponseStream();
    StreamReader _Answer = new StreamReader(Answer);
    Console.WriteLine(_Answer.ReadToEnd());
}

【问题讨论】:

标签: c# json api


【解决方案1】:

首先你需要一个自定义类用于反序列化:

public class Item
{
    public string id { get; set; }
    public string name { get; set; }
    public string symbol { get; set; }
    public string rank { get; set; }
    public string price_usd { get; set; }
    [JsonProperty(PropertyName = "24h_volume_usd")]   //since in c# variable names cannot begin with a number, you will need to use an alternate name to deserialize
    public string volume_usd_24h { get; set; }
    public string market_cap_usd { get; set; }
    public string available_supply { get; set; }
    public string total_supply { get; set; }
    public string percent_change_1h { get; set; }
    public string percent_change_24h { get; set; }
    public string percent_change_7d { get; set; }
    public string last_updated { get; set; }
}

接下来,您可以使用Newtonsoft Json,一个免费的JSON序列化和反序列化框架,通过以下方式获取您的项目(包括以下using语句):

using System.Net;
using System.IO;
using Newtonsoft.Json;

private static void start_get()
{
    HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(string.Format("https://api.coinmarketcap.com/v1/ticker/"));

    WebReq.Method = "GET";

    HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();

    Console.WriteLine(WebResp.StatusCode);
    Console.WriteLine(WebResp.Server);

    string jsonString;
    using (Stream stream = WebResp.GetResponseStream())   //modified from your code since the using statement disposes the stream automatically when done
    {
       StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
       jsonString = reader.ReadToEnd();
    }

    List<Item> items = JsonConvert.DeserializeObject<List<Item>>(jsonString);

    Console.WriteLine(items.Count);     //returns 921, the number of items on that page
}

最后,元素列表存储在items 中。

【讨论】:

    【解决方案2】:

    Keyur PATEL 作品的简化版。

    static void GetCoinValues()
    {
        string json = new WebClient().DownloadString("https://api.coinmarketcap.com/v1/ticker/");
    
        List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json);
    
        foreach (var item in items)
        {
            Console.WriteLine("ID: " + item.id.ToUpper());
            Console.WriteLine("Name: " + item.name.ToUpper());
            Console.WriteLine("Symbol: " + item.symbol.ToUpper());
            Console.WriteLine("Rank: " + item.rank.ToUpper());
            Console.WriteLine("Price (USD): " + item.price_usd.ToUpper());
            Console.WriteLine("\n");
        }
    }
    

    【讨论】:

    • 如何使用您的方法获取特定品种的数据?我在循环中添加了 IF (item.symbol = mySymbol) { set some variables} 但它没有返回任何内容。
    • 没关系,我弄明白了……大小写匹配有问题,所以我不得不大写我的字符串。但是 json 请求似乎限制了列表。没有给出完整的货币清单。无论如何要解决这个问题?
    • 我可以说服你分享你的 github repo 吗?
    • 请注意 WebClient 实现 IDisposable 并且应该具有 Using 或以其他方式处置。
    猜你喜欢
    • 2017-05-27
    • 2022-01-04
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多