Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法转换类型';Newtonsoft.Json.Linq.JProperty';至';Newtonsoft.Json.Linq.JObject';_C#_Json_Linq_Serialization_Json.net - Fatal编程技术网

C# 无法转换类型';Newtonsoft.Json.Linq.JProperty';至';Newtonsoft.Json.Linq.JObject';

C# 无法转换类型';Newtonsoft.Json.Linq.JProperty';至';Newtonsoft.Json.Linq.JObject';,c#,json,linq,serialization,json.net,C#,Json,Linq,Serialization,Json.net,目前正在尝试使用fixer.io API在C#中创建货币转换 在解析来自twitterapi的JSON时,我使用了与下面类似的方法,并且没有任何问题,我不完全确定这里发生了什么 从API返回的JSON示例: { "base": "EUR", "date": "2016-05-05", "rates": { "AUD": 1.5266, "BGN": 1.9558, "BRL": 4.0282, "CAD":

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

在解析来自twitterapi的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);
                }
            }
        }
List-exchangeRate=new-List();
字符串BSE=“USD”;
字符串URL=”http://api.fixer.io/latest?base=“+疯牛病;
使用(var webClient=new System.Net.webClient())
{
var json=webClient.DownloadString(URL);
DynamicStuff=JsonConvert.DeserializeObject(json);
foreach(stuff中的JObject项)
{
exchangeRate.Add(条目[“rates”].ToString());
foreach(汇率中的var率)
{
控制台写入线(费率);
}
}
}
现在我收到的错误是:

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


这发生在“JObject项目”中,您可以尝试以下方法:

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);
        }
    }
}
JObject stuff = JObject.Parse(json);

foreach (JProperty rate in stuff["rates"])
{
    Console.WriteLine(rate.Name + ": " + rate.Value);
}
JToken是任何类型的JSON值的通用表示。它可以是字符串、对象、数组、属性等

JProperty是一个与名称成对的JToken值。它只能添加到JObject,并且其值不能是另一个JProperty


JObject是JProperty的集合。它不能直接保存任何其他类型的JToken。

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

public class ConversionRates
{
    public string @base { get; set; }
    public string date { get; set; }
    public Dictionary<string, decimal> rates { get; set; }
}
公共类转换率
{
公共字符串@base{get;set;}
公共字符串日期{get;set;}
公共字典率{get;set;}
}
然后反序列化到那个

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

在您的代码中,
JsonConvert.DeserializeObject()
正在将
JObject
返回到动态变量
stuff
中。当您使用
foreach
JObject
上迭代时,所枚举的项始终是
JProperty
实例,而不是
JObject
实例。由于
JProperty
不是
JObject
的子类,因此无法将其分配给
JObject
变量,因此会出现此错误

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

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);
        }
    }
}
JObject stuff = JObject.Parse(json);

foreach (JProperty rate in stuff["rates"])
{
    Console.WriteLine(rate.Name + ": " + rate.Value);
}
小提琴: