首页 > 解决方案 > 在c#中转换返回多种类类型的Json

问题描述

所以我已经开始为自己做一个项目,我正在使用 AlphaVantage API(https://www.alphavantage.co/documentation/)但是我遇到了一个问题,他们返回一个大致像这样结构的对象:

{[Meta Data, {{
  "1. Information": "Weekly Prices (open, high, low, close) and Volumes",
  "2. Symbol": "ko",
  "3. Last Refreshed": "2019-12-13",
  "4. Time Zone": "US/Eastern"
}}]}
{[Weekly Time Series, {{
  "2019-12-13": {
    "1. open": "54.3000",
    "2. high": "54.5500",
    "3. low": "53.6600",
    "4. close": "54.4200",
    "5. volume": "54644469"
  },
  "2019-12-13": {
    "1. open": "54.3000",
    "2. high": "54.5500",
    "3. low": "53.6600",
    "4. close": "54.4200",
    "5. volume": "54644469"
  }
}}]}

这将被构造为两个独立的对象,如下所示:

public class MetaData
{
    public string Information { get; set; }
    public string Symbol { get; set; }
    public DateTime LastRefresh { get; set; }
    public String TimeZone { get; set; }
}
public class Data
{
    public List<ValueData> entry { get; set; }
}
public class ValueData
{
    public DateTime Date { get; set; }
    public decimal Open { get; set; }
    public decimal High { get; set; }
    public decimal Low { get; set; }
    public decimal Close { get; set; }
    public int Volume { get; set; }
}

我的问题是反序列化的最佳实践是什么?我试着只对一个对象类型这样做,并用调试器检查它,它包含 2 个独立的结构。

标签: c#jsonjson-deserialization

解决方案


在 C# 中,有多种方法可以将 JSON 反序列化为对象。最流行的Newtonsoft.Json也称为.NET Core 3.0 中Json.NETSystem.Text.JsonAPI,您可以使用它。这是两者的示例:

json.net

var obj = JsonConvert.DeserializeObject<Type>(jsonString);

您的基础基本类型在哪里Type(它似乎只是一个包含 and 属性的类Meta DataWeekly Time Series并且jsonString是您下载的 JSON。Alphavantage 在其属性名称中使用空格,因此您需要使用JsonPropertyAttribute属性并指定名称

或者 .NET Core 3:

var obj = JsonSerializer.Parse<Type>(jsonString);

哪里又Type是您的基础基类型,哪里又一次您需要使用属性来正确映射属性,但这次您需要JsonPropertyNameAttribute

但是,如果您不想自己创建和测试这些类,您可以查看Alphavantage.Net,它虽然未经测试,但可以为您节省大量时间。感谢 Christoph Lütjen在评论中链接它


推荐阅读