【问题标题】:Keyvaluepair value is 0 when reading JSON file读取 JSON 文件时 Keyvaluepair 值为 0
【发布时间】:2020-10-31 16:33:21
【问题描述】:

我正在尝试在 c# 中学习 JSON 和 webrequests,但遇到了这个问题:

keyvaluepair 的值始终为 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 中获取每个日期的双倍价值。如果我只能使用 JPY 的日期和双精度值,我就可以了。注意:日元是一个例子,这可能是除欧元之外的所有货币。

抱歉,如果我无法按名称获取每个元素,我仍在学习中。

【问题讨论】:

    标签: c# json.net restsharp


    【解决方案1】:

    再次查看 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&lt;string, Rate&gt;,这很好 - 但这意味着您希望得到这样的结果:

    { "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&lt;string, Dictionary&lt;string, double&gt;&gt; 更有意义(并完全删除您的Rate 类)。

    【讨论】:

    • 感谢您愿意提供帮助!我不能将 JsonProperty 设置为“JPY”,因为它必须是动态的。假设我想兑换美元,那么我不要求 JPY 并且 JsonProperty("JPY") 是不必要的(如果我错了,请纠正我)。我试图使用你的代码,但我很难反序列化它。当我想要 var result = JsonConvert.DeserializeObject&lt;Dictionary&lt;string, Dictionary&lt;string, double&gt;&gt;&gt;(response); 时,我得到“无法将 'RestSharp.IRestResponse>' 转换为 'string'
    • @JulesHouben:您的错误消息谈到了我当然没有提到的类型,这很难帮助您。但请注意,我没有建议更改您的 DeserializeObject 调用 - 我建议更改您的 Rates 属性的类型。
    • 啊谢谢我明白了!非常感谢您的帮助!祝你有美好的一天:)
    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2020-05-20
    相关资源
    最近更新 更多