Json 解析失败但绝对路径有效
Json parsing failed but absolute path works
我尝试在循环中的 Form Load 事件中从 Web 解析 json。
但由于未知原因,我得到一个例外:
System.InvalidOperationException: 'Cannot access child value on Newtonsoft.Json.Linq.JProperty.'
但是当我通过绝对路径检查一个单元时 - 它给了我价值。
//var test = (string)ratesjson["Valute"]["AUD"]["CharCode"];
请让我知道我哪里错了。
private string url = "https://www.cbr-xml-daily.ru/daily_json.js";
private async Task<List<CurrencyRateMap>> GetCurrencyRates()
{
var list = new List<CurrencyRateMap>();
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);
var result = await response.Content.ReadAsStringAsync();
var ratesjson = JObject.Parse(result);
//var test = (string)ratesjson["Valute"]["AUD"]["CharCode"];
foreach (var x in ratesjson["Valute"])
{
CurrencyRateMap crm = new CurrencyRateMap {
CurrencyCode = (string)x["CharCode"],
CurrencyRate = (double)x["Value"]
};
list.Add(crm);
}
return list;
}
private async void MetroWindow_Loaded(object sender, RoutedEventArgs e)
{
CurrentContext.CurrencyRates = await GetCurrencyRates();
}
循环中的 x
是一个名称为 属性 的对象,例如 AUD
等,CharCode
和 Value
属性隐藏在下面那个水平。但是,将 JSON 解析为实际的 C# 对象会容易得多。它们更容易编写代码,也更安全。例如:
public class Root
{
public Dictionary<string, CurrencyRateMap> Valute { get; set; }
}
public class CurrencyRateMap
{
public string Id { get; set; }
public string NumCode { get; set; }
public string CharCode { get; set; }
public double Value { get; set; }
}
现在您可以这样做了:
var ratesjson = JsonConvert.DeserializeObject<Root>(result);
list = ratesjson.Valute.Select(v => v.Value).ToList();
我尝试在循环中的 Form Load 事件中从 Web 解析 json。 但由于未知原因,我得到一个例外:
System.InvalidOperationException: 'Cannot access child value on Newtonsoft.Json.Linq.JProperty.'
但是当我通过绝对路径检查一个单元时 - 它给了我价值。
//var test = (string)ratesjson["Valute"]["AUD"]["CharCode"];
请让我知道我哪里错了。
private string url = "https://www.cbr-xml-daily.ru/daily_json.js";
private async Task<List<CurrencyRateMap>> GetCurrencyRates()
{
var list = new List<CurrencyRateMap>();
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);
var result = await response.Content.ReadAsStringAsync();
var ratesjson = JObject.Parse(result);
//var test = (string)ratesjson["Valute"]["AUD"]["CharCode"];
foreach (var x in ratesjson["Valute"])
{
CurrencyRateMap crm = new CurrencyRateMap {
CurrencyCode = (string)x["CharCode"],
CurrencyRate = (double)x["Value"]
};
list.Add(crm);
}
return list;
}
private async void MetroWindow_Loaded(object sender, RoutedEventArgs e)
{
CurrentContext.CurrencyRates = await GetCurrencyRates();
}
循环中的 x
是一个名称为 属性 的对象,例如 AUD
等,CharCode
和 Value
属性隐藏在下面那个水平。但是,将 JSON 解析为实际的 C# 对象会容易得多。它们更容易编写代码,也更安全。例如:
public class Root
{
public Dictionary<string, CurrencyRateMap> Valute { get; set; }
}
public class CurrencyRateMap
{
public string Id { get; set; }
public string NumCode { get; set; }
public string CharCode { get; set; }
public double Value { get; set; }
}
现在您可以这样做了:
var ratesjson = JsonConvert.DeserializeObject<Root>(result);
list = ratesjson.Valute.Select(v => v.Value).ToList();