读取JSON文件时,Keyvaluepair的值为0。

3

我正在尝试学习C#中的JSON和Web请求,并遇到了以下问题:

keyvaluepair始终具有值0。

JSON(来自此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" 一起使用。当我使用 "rates" 时,我只能获取日期,取决于我是否使用 kvp.Value,我会得到 EuroDollarConverterRealtime.Rate 或当我使用 kvp.Value.Valuta 时我得到0。

我的目标是获得每个日期的JPY双倍值。如果我只能使用日期和JPY的双倍值,那也行。注意:JPY只是一个例子,这可以是除欧元以外的任何货币。

如果我不能通过名称获取每个元素,很抱歉,我还在学习中。

1个回答

4

再次查看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如何处理JSON中的 "JPY" 属性?

如果你只会得到 JPY 作为键,你可以Rate 上指定:

public partial class Rate
{
    [JsonProperty("JPY")]
    public double Valuta { get; set; }
}

...但我认为将Rates声明为Dictionary<string, Dictionary<string, double>>(并完全删除您的Rate类)可能更有意义。


感谢您愿意帮忙!我无法将JsonProperty设置为“JPY”,因为它必须是动态的。比如说,如果我想要转换美元,那么我就不需要请求日元,这时JsonProperty(“JPY”)就是不必要的(如果我理解有误请指正)。我尝试使用您的代码,但是我在反序列化时遇到了困难。当我想要var result = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, double>>>(response);时,我得到了“无法将'RestSharp.IRestResponse<System.collections.Generic.List<EuroDollarconverterRealtime.ConversionRatesLastYear>>'转换为'string'”的错误提示。 - JJuless
1
@JulesHouben:你的错误信息提到了我肯定没有提到的类型,这使得帮助你变得困难。但请注意,我并没有建议更改您的DeserializeObject调用 - 我建议更改您的Rates属性的类型。 - Jon Skeet
啊,谢谢,我明白了!非常感谢你的帮助!祝你有美好的一天 :) - JJuless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接