Во-первых, измените модель данных так, чтобы она выглядела следующим образом:
public class Rate
{
public string name { get; set; }
public decimal rate { get; set; }
}
public class RootObject
{
public Dictionary<string, Rate> rates { get; set; }
public string time { get; set; }
}
Затем введите следующий метод расширения:
public static partial class RateExtensions
{
public static bool TryGetConversion(this Dictionary<string, Rate> rates, string from, string to, out decimal rate)
{
Rate fromRate;
Rate toRate;
if (rates == null || !rates.TryGetValue(from, out fromRate))
{
rate = 0;
return false;
}
if (!rates.TryGetValue(to, out toRate))
{
rate = 0;
return false;
}
rate = toRate.rate / fromRate.rate;
return true;
}
}
Теперь вы можете выполнить типизированный запрос какследующим образом.Напечатанный запрос автоматически десериализует ответ в желаемую модель данных:
var btcAvgClient = new RestClient("https://apiv2.bitcoinaverage.com/");
var request = new RestRequest("constants/exchangerates/local");
// Execute the request and get the typed response
var response = btcAvgClient.Execute<RootObject>(request);
// Get the root object from the response.
RootObject data = response.Data;
и вычислит перевод из USD в CAD следующим образом:
// Compute the converson from (e.g.) USD to CAD
var fromName = "USD";
var toName = "CAD";
decimal rate;
if (data.rates.TryGetConversion(fromName, toName, out rate))
{
Console.WriteLine("Conversion from {0} to {1} = {2}", fromName, toName, rate);
}
else
{
Console.WriteLine("Cannot get conversion from {0} to {1}.", fromName, toName);
}
На моем компьютере это выдает
Преобразование из USD в CAD = 1.36245
Что в настоящее время кажется правильным числом, подтвержденным поиском Google :
1 доллар США равен 1,36 канадского доллара
Примечания:
Поскольку этот API может в будущем возвращать разные валюты, но с той жеДля каждого из данных я определил rates
как Dictionary<string, Rate> rates
.Словарь фиксирует все возвращенные курсы валют.
Ваш код должен знать ожидаемые названия валют, но я считаю, что они являются стандартными.
Поскольку здесь мы проводим конвертацию валют, я определил rate
длябыть decimal
, а не string
.Сериализатор автоматически десериализует строковое значение для "rate"
в десятичное число.
Чтобы убедиться, что ваш запрос был успешным, см. Как идиоматически обрабатывать коды ошибок HTTP при использованииRestSharp? .
В качестве альтернативы вы можете проверить response.ErrorException
, как показано на странице документации Рекомендуемое использование .
Если вам нужно сделать async
запросов, см. Как мне реализовать ExecuteAsync с RestSharp на Windows Phone 7? .
RestSharp имеет встроенный сериализатор JSON , но вы можете использовать Json.NET, если хотите.Просто получите строку response.Content
и выполните десериализацию, выполнив:
// Execute the request and get the untyped (string) response
var response = btcAvgClient.Execute(request);
// Get the root object from the response.
RootObject data = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(response.Content);