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 等,CharCodeValue 属性隐藏在下面那个水平。但是,将 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();