从API中获取数字并将其放入变量中。

3
我想从此API中获取以usd为单位的价格值,并将其放入一个变量中: https://api.coingecko.com/api/v3/simple/price?ids=veco&vs_currencies=usd 我已经尝试了这段代码,但是出现了错误:
public static void StartGet()
    {
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(string.Format(VECO.VecoPriceURL));

        WebReq.Method = "GET";

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

        string jsonString;
        using (Stream stream = WebResp.GetResponseStream())
        {
            StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
            jsonString = reader.ReadToEnd();
        }

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

        foreach (var item in items)
        {
            Console.WriteLine(item.usd);
        }
    }

public class VECO
{
    public static string VecoPriceURL = "https://api.coingecko.com/api/v3/simple/price?ids=veco&vs_currencies=usd";

    public class Coin
    {
        public string usd { get; set; }
    }
}

错误:

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current 
JSON object (e.g. {"name":"value"}) into type 
'System.Collections.Generic.List`1[ConsoleProgram.VECO+Coin]' because the 
type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or 
change the deserialized type so that it is a normal .NET type (e.g. not a 
primitive type like integer, not a collection type like an array or List<T>) 
that can be deserialized from a JSON object. JsonObjectAttribute can also be 
added to the type to force it to deserialize from a JSON object.
Path 'veco', line 1, position 8.'
1个回答

2

你的数据结构需要稍微不同。

public class Veco
{
    public decimal usd { get; set; }
}

public class RootObject
{
    public Veco veco { get; set; }
}

请注意,Json不是数组或列表,因此您在JsonConvert.DeserializeObject方法中需要使用List<>。相反,您需要按照以下方式操作。"最初的回答":

请注意,Json不是数组或列表,因此您需要在JsonConvert.DeserializeObject方法中使用List<>。相反,您需要按照以下方式操作。

var result = JsonConvert.DeserializeObject<RootObject>(jsonString);

Example,

var jsonString = @"{'veco':{'usd':0.01558532}}";
var result = JsonConvert.DeserializeObject<RootObject>(jsonString);
Console.WriteLine($"USD Rate : {result.veco.usd}");

输出

USD Rate 0.01558532

重写你的方法,最初的回答。
 public static void StartGet()
 {
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(string.Format(VECO.VecoPriceURL));

        WebReq.Method = "GET";

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

        string jsonString;
        using (Stream stream = WebResp.GetResponseStream())
        {
            StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
            jsonString = reader.ReadToEnd();
        }

        var item = JsonConvert.DeserializeObject<RootObject>(jsonString);
        Console.WriteLine(item.veco.usd);
 }

更新

根据您的评论,我会将您的方法重写如下。您不再需要数据结构。

public static void StartGet(string id)
{
        var url = $"https://api.coingecko.com/api/v3/simple/price?ids={id}&vs_currencies=usd";
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
        WebReq.Method = "GET";
        HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
        string jsonString;
        using (Stream stream = WebResp.GetResponseStream())
        {
            StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
            jsonString = reader.ReadToEnd();
        }

       var result = JsonConvert.DeserializeObject<JToken>(jsonString);
       Console.WriteLine($"For {id},USD Rate : {result[id].Value<string>("usd")}");
}

现在你可以按照以下方法使用该方法:
StartGet("veco");
StartGet("eos");
StartGet("uraniumx");

输出

For veco,USD Rate : 0.01581513
For eos,USD Rate : 2.42
For uraniumx,USD Rate : 0.890397

如果我想将“StartGet()”作为方法使用,我该如何使用此行“var result = JsonConvert.DeserializeObject <RootObject>(jsonString);”?例如:“StartGet(string url,...)”。 - aria darkkkis
为了获取和打印结果,您可以执行 var items = JsonConvert.DeserializeObject<RootObject>(jsonString); Console.WriteLine(item.veco.usd)。 - Anu Viswan
如果你还是不明白,我可以更新我的答案,以适应你修改后的StartGet方法。让我知道。 - Anu Viswan
我知道。但是我想在这个应用程序中添加更多的加密货币,比如比特币和其他一些货币。正如你所说,它们每一个都有一个public class COIN_NAMEpublic class RootObject。我想要这个方法StartGet(),获取我想要的每个硬币的美元价值。就像我给它比特币的url,从json中获取美元价值以及许多其他硬币。使用上面的代码,我必须为我想要获取其美元价值的每个硬币使用那个StartGet()方法。 - aria darkkkis
嗯...你能分享另一个像veco这样的示例ID吗? - Anu Viswan
显示剩余3条评论

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