【问题标题】:Deserializing weirdly formatted JSON to an object in C#将格式怪异的 JSON 反序列化为 C# 中的对象
【发布时间】:2020-07-19 09:10:17
【问题描述】:

我正在尝试自学使用 API,并选择尝试制作一些东西,从某个免费的API 中获取货币汇率。我已经成功地进行了 API 调用并从中记录了 JSON 数据,并且我想保存数据以便可以从对象轻松访问。

我的问题是这样的; JSON 数据读起来像

{
    "Realtime Currency Exchange Rate": {
        "1. From_Currency Code": "USD",
        "2. From_Currency Name": "United States Dollar",
        "3. To_Currency Code": "EUR",
        "4. To_Currency Name": "Euro",
        "5. Exchange Rate": "0.87490000",
        "6. Last Refreshed": "2020-07-19 08:16:36",
        "7. Time Zone": "UTC",
        "8. Bid Price": "0.87490000",
        "9. Ask Price": "0.87540000"
    }
}

使用https://json2csharp.com/ 我得到这样的结果

public class RealtimeCurrencyExchangeRate    {
    public string 1.From_CurrencyCode { get; set; } 
    public string 2.From_CurrencyName { get; set; } 
    public string 3.To_CurrencyCode { get; set; } 
    public string 4.To_CurrencyName { get; set; } 
    public string 5.ExchangeRate { get; set; } 
    public string 6.LastRefreshed { get; set; } 
    public string 7.TimeZone { get; set; } 
    public string 8.BidPrice { get; set; } 
    public string 9.AskPrice { get; set; } 
}

这不是有效的 c# 语法。我拥有的 JSON 解析器可以反序列化该信息(我认为),但 Visual Studio 对我试图命名一个变量 1.From_CurrencyCode

【问题讨论】:

  • 您也可以将其取消实现为Dictionary<string, string>

标签: c# json api


【解决方案1】:

您可以使用JsonProperty 属性(如果您使用的是Newtonsoft.Json)来装饰您的每个模型属性。这允许您将 Json 属性名称重命名为有效的 C# 属性名称。

public class RealtimeCurrencyExchangeRate    
{
    [JsonProperty("1. From_Currency Code")]
    public string FromCurrencyCode { get; set; } 
    
    // similarly for the remaining properties
    ...
}

// also apply it to your "root" class
public class Root    
{
    [JsonProperty("Realtime Currency Exchange Rate")]
    public RealtimeCurrencyExchangeRate RealtimeCurrencyExchangeRate { get; set; }
}

【讨论】:

    【解决方案2】:

    我也没有搬到System.Text.Json,我坚持使用Newtonsoft.Json。 目前我更喜欢 基于约定的方法 来反序列化,在这种情况下,我不会用 json 属性污染我的模型。此外,这看起来像是一个糟糕的 API(恕我直言),这些属性名称很糟糕。

    因此,在这种情况下,我会选择 tolerant reader(就像 Martin Fowler 宣传的那样)而不是强类型对象,以及以下 3 种技术之一(异或):

    【讨论】:

      猜你喜欢
      • 2019-07-21
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      相关资源
      最近更新 更多