目前正在尝试使用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);
}
}
}
现在我收到的错误是:
无法转换类型&#39; Newtonsoft.Json.Linq.JProperty&#39; to&#39; Newtonsoft.Json.Linq.JObject&#39;
这发生在&#34; JObject项&#34;
答案 0 :(得分:3)
如果您使用与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);
答案 1 :(得分:2)
您可以尝试这样的事情:
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。
答案 2 :(得分:2)
在您的代码中,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);
}