【问题标题】:Cannot convert type 'Newtonsoft.Json.Linq.JProperty' to 'Newtonsoft.Json.Linq.JObject'无法将类型“Newtonsoft.Json.Linq.JProperty”转换为“Newtonsoft.Json.Linq.JObject”
【发布时间】:2016-08-31 16:28:27
【问题描述】:

目前正在尝试使用 fixer.io API 在 C# 中创建货币转换。

我在从 twitter API 解析 JSON 时使用了与下面类似的方法,并且没有任何问题,我不完全确定这里发生了什么。

API 返回的 JSON 示例:

 {
    "base": "EUR",
    "date": "2016-05-05",
    "rates": {
        "AUD": 1.5266,
        "BGN": 1.9558,
        "BRL": 4.0282,
        "CAD": 1.4665,
        "CHF": 1.1018,
        "CNY": 7.441,
        "CZK": 27.028,
        "DKK": 7.4401,
        "GBP": 0.7886,
        "HKD": 8.8775,
        "HRK": 7.515,
        "HUF": 312.84,
        "IDR": 15260.95,
        "ILS": 4.3221,
        "INR": 76.0745,
        "JPY": 122.51,
        "KRW": 1333.95,
        "MXN": 20.2155,
        "MYR": 4.5819,
        "NOK": 9.2985,
        "NZD": 1.6577,
        "PHP": 54.171,
        "PLN": 4.4234,
        "RON": 4.5035,
        "RUB": 75.0559,
        "SEK": 9.2575,
        "SGD": 1.5531,
        "THB": 40.191,
        "TRY": 3.3166,
        "USD": 1.1439,
        "ZAR": 17.0751
    }
}

这是我目前正在使用的代码:

        List<string> exchangeRate = new List<string>();
        string BSE = "USD";
        string URL = "http://api.fixer.io/latest?base=" + BSE;

        using (var webClient = new System.Net.WebClient())
        {
            var json = webClient.DownloadString(URL);
            dynamic stuff = JsonConvert.DeserializeObject(json);

            foreach (JObject item in stuff)
            {
                exchangeRate.Add(item["rates"].ToString());

                foreach (var rates in exchangeRate)
                {
                    Console.WriteLine(rates);
                }
            }
        }

现在我收到的错误是:

无法将类型“Newtonsoft.Json.Linq.JProperty”转换为“Newtonsoft.Json.Linq.JObject”

这发生在“JObject 项”

【问题讨论】:

    标签: c# json linq serialization json.net


    【解决方案1】:

    在您的代码中,JsonConvert.DeserializeObject()JObject 返回到动态变量 stuff。当您使用foreach 迭代JObject 时,被枚举的项目始终是JProperty 实例,而不是JObject 实例。由于JProperty 不是JObject 的子类,因此您不能将其分配给JObject 变量,这就是您收到此错误的原因。

    如果您只是想将所有货币汇率打印到控制台,您可以这样做:

    JObject stuff = JObject.Parse(json);
    
    foreach (JProperty rate in stuff["rates"])
    {
        Console.WriteLine(rate.Name + ": " + rate.Value);
    }
    

    小提琴:https://dotnetfiddle.net/fpS9CM

    【讨论】:

      【解决方案2】:

      如果您使用与您的 Json 匹配的强类型对象,那么您会发现使用已反序列化的对象更容易。试试这个:

      public class ConversionRates
      {
          public string @base { get; set; }
          public string date { get; set; }
          public Dictionary<string, decimal> rates { get; set; }
      }
      

      然后反序列化到那个。

      var obj = JsonConvert.DeserializeObject<ConversionRates>(yourJson);
      

      【讨论】:

        【解决方案3】:

        你可以试试这样的:

        foreach (JProperty item in stuff)
        {
            if (item.Name == "rates")
            {
                exchangeRate.AddRange(from rate in item from xch in rate select xch.ToString());
                foreach (var value in exchangeRate)
                {
                    Console.WriteLine(value);
                }
            }
        }
        

        JToken 是任何类型的 JSON 值的通用表示。可以是字符串、对象、数组、属性等。

        JProperty 是与名称配对的单个 JToken 值。只能添加到 JObject 中,其值不能是另一个 JProperty。

        JObject 是 JProperties 的集合。它不能直接持有任何其他类型的 JToken。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多