读取 JSON 文件时键值对值为 0
Keyvaluepair value is 0 when reading JSON file
我正在尝试学习 JSON 和 c# 中的 webrequests,但遇到了这个问题:
键值对的值始终为 0。
JSON (from this api):
"rates": {
"2020-08-03": { "JPY": 124.51 },
"2020-08-25": { "JPY": 125.67 },
"2019-11-20": { "JPY": 119.96 },
"2020-04-08": { "JPY": 118.36 }
},
"start_at": "2019-10-28",
"base": "EUR",
"end_at": "2020-10-28"
}
Conversion.cs
public partial class ConversionRatesLastYear
{
[JsonProperty("rates")]
public Dictionary<string, Rate> Rates { get; set; }
[JsonProperty("start_at")]
public DateTimeOffset StartAt { get; set; }
[JsonProperty("base")]
public string Base { get; set; }
[JsonProperty("end_at")]
public DateTimeOffset EndAt { get; set; }
}
public partial class Rate
{
public double Valuta { get; set; }
}
我的方法
public void SelectedValuta(string valuta)
{
IRestClient restClient = new RestClient();
DateTime dtLastYear = DateTime.Today.AddYears(-1);
DateTime dtToday = DateTime.Today;
string lastYear = dtLastYear.ToString("yyyy-MM-dd");
string today = dtToday.ToString("yyyy-MM-dd");
Console.WriteLine(lastYear + " " + today);
IRestRequest request = new RestRequest(url + "history?start_at=" + lastYear + "&end_at=" + today + "&symbols="+valuta, DataFormat.Json);
var response = restClient.Get<List<ConversionRatesLastYear>>(request);
foreach (var kvp in response.Data[0].Rates)
{
//gives Value = EuroDollarConverterRealtime.Rate
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
//gives Value = 0
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, (double)kvp.Value.Valuta);
}
}
当我这样做时,我可以看到 JSON 中的全部内容:
Console.WriteLinke(response.Content)
所以问题不在于获取信息。我可以在另一种方法中毫无问题地使用“start_at”、“base”、“end_at”,但不能使用“rates”。当我做费率时,我只能得到日期,这取决于我是使用 kvp.Value 我得到 EuroDollarConverterRealtime.Rate 还是当我使用 kvp.Value.Valuta 我得到 0.
我的目标是在每个日期从日元中获得双倍价值。如果我只能使用 JPY 的日期和双精度值,我就可以了。注意:以日元为例,这可以是除欧元以外的所有货币。
抱歉,如果我无法通过名称获取每个元素,我仍在学习中。
再看JSON中的rates
:
"rates": {
"2020-08-03": { "JPY": 124.51 },
"2020-08-25": { "JPY": 125.67 },
"2019-11-20": { "JPY": 119.96 },
"2020-04-08": { "JPY": 118.36 }
}
您已将其声明为 Dictionary<string, Rate>
,这很好 - 但这意味着您期望这样的结果:
{ "JPY": 124.51 }
... 被反序列化为 Rate
。您有一个 属性、Valuta
,没有 JsonProperty
属性,那么您希望 Json.NET 对 属性 中的“JPY”做什么? JSON?
如果您只想获得 JPY 作为密钥,您 可以 只需在 Rate
:
上指定
public partial class Rate
{
[JsonProperty("JPY")]
public double Valuta { get; set; }
}
...但我怀疑将 Rates
声明为 Dictionary<string, Dictionary<string, double>>
更有意义(并完全删除 Rate
class)。
我正在尝试学习 JSON 和 c# 中的 webrequests,但遇到了这个问题:
键值对的值始终为 0。
JSON (from this api):
"rates": {
"2020-08-03": { "JPY": 124.51 },
"2020-08-25": { "JPY": 125.67 },
"2019-11-20": { "JPY": 119.96 },
"2020-04-08": { "JPY": 118.36 }
},
"start_at": "2019-10-28",
"base": "EUR",
"end_at": "2020-10-28"
}
Conversion.cs
public partial class ConversionRatesLastYear
{
[JsonProperty("rates")]
public Dictionary<string, Rate> Rates { get; set; }
[JsonProperty("start_at")]
public DateTimeOffset StartAt { get; set; }
[JsonProperty("base")]
public string Base { get; set; }
[JsonProperty("end_at")]
public DateTimeOffset EndAt { get; set; }
}
public partial class Rate
{
public double Valuta { get; set; }
}
我的方法
public void SelectedValuta(string valuta)
{
IRestClient restClient = new RestClient();
DateTime dtLastYear = DateTime.Today.AddYears(-1);
DateTime dtToday = DateTime.Today;
string lastYear = dtLastYear.ToString("yyyy-MM-dd");
string today = dtToday.ToString("yyyy-MM-dd");
Console.WriteLine(lastYear + " " + today);
IRestRequest request = new RestRequest(url + "history?start_at=" + lastYear + "&end_at=" + today + "&symbols="+valuta, DataFormat.Json);
var response = restClient.Get<List<ConversionRatesLastYear>>(request);
foreach (var kvp in response.Data[0].Rates)
{
//gives Value = EuroDollarConverterRealtime.Rate
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
//gives Value = 0
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, (double)kvp.Value.Valuta);
}
}
当我这样做时,我可以看到 JSON 中的全部内容:
Console.WriteLinke(response.Content)
所以问题不在于获取信息。我可以在另一种方法中毫无问题地使用“start_at”、“base”、“end_at”,但不能使用“rates”。当我做费率时,我只能得到日期,这取决于我是使用 kvp.Value 我得到 EuroDollarConverterRealtime.Rate 还是当我使用 kvp.Value.Valuta 我得到 0.
我的目标是在每个日期从日元中获得双倍价值。如果我只能使用 JPY 的日期和双精度值,我就可以了。注意:以日元为例,这可以是除欧元以外的所有货币。
抱歉,如果我无法通过名称获取每个元素,我仍在学习中。
再看JSON中的rates
:
"rates": {
"2020-08-03": { "JPY": 124.51 },
"2020-08-25": { "JPY": 125.67 },
"2019-11-20": { "JPY": 119.96 },
"2020-04-08": { "JPY": 118.36 }
}
您已将其声明为 Dictionary<string, Rate>
,这很好 - 但这意味着您期望这样的结果:
{ "JPY": 124.51 }
... 被反序列化为 Rate
。您有一个 属性、Valuta
,没有 JsonProperty
属性,那么您希望 Json.NET 对 属性 中的“JPY”做什么? JSON?
如果您只想获得 JPY 作为密钥,您 可以 只需在 Rate
:
public partial class Rate
{
[JsonProperty("JPY")]
public double Valuta { get; set; }
}
...但我怀疑将 Rates
声明为 Dictionary<string, Dictionary<string, double>>
更有意义(并完全删除 Rate
class)。