Я хочу получить значение цены usd в этом API и поместить его в переменную:
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.'





Ваши структуры данных должны немного отличаться.
public class Veco
{
public decimal usd { get; set; }
}
public class RootObject
{
public Veco veco { get; set; }
}
Обратите внимание, что Json не является массивом или списком, поэтому вам также необходимо использовать List<> в методе JsonConvert.DeserializeObject. Вместо этого вам нужно следующее.
var result = JsonConvert.DeserializeObject<RootObject>(jsonString);
Пример,
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
И как я могу использовать эту строку var result = JsonConvert.DeserializeObject<RootObject>(jsonString);, если я хочу использовать StartGet() как метод. Как StartGet(string url,...)
Для получения и печати результата вы можете выполнить var items = JsonConvert.DeserializeObject<RootObject>(jsonString); Console.WriteLine(item.veco.usd)
Если вы все еще этого не понимаете, я могу обновить свой ответ с помощью вашего модифицированного метода StartGet. Дай мне знать
Я знаю. Но я хочу добавить в это приложение больше монет, таких как Биткойн и некоторые другие монеты. У каждого из них, как вы сказали, есть public class COIN_NAME и public class RootObject. Мне нужен этот метод StartGet(), чтобы получить стоимость каждой монеты в долларах США, которую я хочу. Например, я даю URL-адрес биткойна и получаю значение в долларах США из json и многих других монет. С приведенным выше кодом я должен использовать этот StartGet() для каждой монеты, которую я хочу получить в долларах США.
У меня есть другой класс, такой же, как класс VECO, но называемый биткойн, и я хочу, чтобы StartGet() возвращал usd для многих из этих классов. VECO, Bitcoin и т. д. Отредактированный вами метод StartGet() возвращает только значение usd класса VECO.
хм... не могли бы вы поделиться другим примером идентификатора, как у veco?
@ariadarkkkis, пожалуйста, проверьте ответ сейчас. я обновил его.
@ariadarkkkis Рад помочь вам. Пожалуйста, отметьте его как ответ, если он помог вам решить проблему.