【发布时间】:2018-11-01 08:00:47
【问题描述】:
完整的 JSON 新手 - 这是我第一次使用 C# 进入 JSON。
我有一条从 HTTP 获取请求返回的记录。
var exchRateData = Get($"https://api.exchangeratesapi.io/2018-10-30?base=EUR&symbols=AUD");
返回:
{"date":"2018-10-30","rates":{"AUD":1.6025},"base":"EUR"}.
AUD 和 1.6025 值都是 GET 请求中的变量。因此 GET 请求可以针对它返回的 SGD 或 INR:
{"date":"2018-10-30","rates":{"SGD":0.0187977737},"base":"INR"}
总是返回一个带有级别的记录,就像上面的两个示例一样。
我想要的是访问二级值的值,
即{"AUD":1.6025} or {"SGD":0.0187977737}
我试过了:
var jsonResult = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(exchRateData);
foreach (var keyValue in jsonResult)
{
try
{
LblGetValues.Text = LblGetValues.Text + "Key: " + keyValue.Key + " Value:" + keyValue.Value + "<br>";
if (keyValue.Key == "date")
LblDate.Text = keyValue.Value;
//This is where I get stuck.
if (keyValue.Key == "rates")
{
// I would like to be able to do this here :
//string currencyCode = "AUD" (or "SGD" if second GET request)
//double currencyRate = 1.6025 (or 0.0187977737 if second GET request)
//JArray secondLevel = new JArray("rates");
// LblRate.Text = keyValue.Value.ToString();
}
if (keyValue.Key == "base")
LblBase.Text = keyValue.Value;
}
catch (Exception errMsg)
{
LblMsg.Text = errMsg.Message + errMsg.StackTrace;
}
}
请帮忙....
【问题讨论】:
-
这可能会有所帮助 - 它有一个很好的扩展方法的答案:stackoverflow.com/questions/16079116/…
-
TheGeneral 有点被动攻击性。 ePossum,不过,作为记录,一个易于阅读的问题更容易回答,这里有一个指向标记的链接,用于格式化您将来可能遇到的问题:stackoverflow.com/editing-help
-
我看不到你所说的“被动攻击”。今天早上我感觉很好,我不会让这个来自@user3577502 的小讽刺破坏我的一天。感谢 Mihir Dave 的解决方案。像魅力一样工作,你让我很开心....
-
@ePossum 如果您只请求一种货币而不是多种货币(例如api.exchangeratesapi.io/…),则可接受的解决方案将起作用。检查我的答案
-
是的@Rui Jarimba。你说的对。但是,我确实接受了这个解决方案,因为我们在这个项目中只需要一个费率。我们需要在两个货币代码之间进行转换。 API 还具有多个日期、日期范围等选项,我们不希望通过查看返回单一汇率以外的解决方案来扩大范围,但是,您的回答很有用,因为我们将在完成转换后开始进行货币三角测量项目。这两个项目是完全独立的,因此无需为两者采用相同的解决方案。我当然已经标记了你的答案。