【问题标题】:Mapping JSON to C# classes when there are multiple keys [duplicate]有多个键时将 JSON 映射到 C# 类[重复]
【发布时间】:2018-12-12 20:44:09
【问题描述】:

我目前正在尝试解析从 IEX api 返回的 JSON 数据,其中包含股票及其信息。我遇到的问题是,根据您请求返回的键更改为该符号的股票/符号(即 AAPL、GOOGL 等)。返回的 JSON 示例见此处:https://api.iextrading.com/1.0/stock/market/batch?symbols=aapl,fb,googl&types=quote,chart&range=1m

为了反序列化,我使用 JSON.NET 和以下类:

public class Stock  {
    public quote Quote { get; set;}
    public chart Chart { get; set;}
}

public class Root {
    public Stock[] Stock;
}

然后我还有报价和图表对象的类。然后我使用以下方法反序列化 JSON:

var stocks =  JsonConvert.DeserializeObject<Root>(jsonstring);

但是,这不起作用,但是在将“Stock”类重命名为符号名称之一时确实有效,但是只有该符号 JSON 被解析。我不知道这里发生了什么,所以非常感谢任何帮助!

【问题讨论】:

  • 由于您使用的是 iextrading,您是否考虑过使用已经构建的库以便您不必构建结构?见codepoc.io/blog/web-api/5297/…
  • 你可以像下面这样创建你的类: public class AAPL { [JsonProperty("quote")] public Quote Quote; } 公共类 Root { [JsonProperty("AAPL")] 公共 AAPL Appl; } public class Quote { [JsonProperty("symbol")] public string Symbol; // 其他属性 .. }
  • 从 API 获取数据的方法:静态异步任务 getStocks() { HttpClient client = new HttpClient(); HttpResponseMessage response = await client.GetAsync("api.iextrading.com/1.0/stock/market/…); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); return responseBody; }
  • 我创建了一个简单的控制台应用程序,您可以在 Main 方法中进行这样的转换: static void Main(string[] args) { var data = getStocks().GetAwaiter().GetResult (); var res = JsonConvert.DeserializeObject(data); // 另一种获取反序列化数据的方法 dynamic stuff = JsonConvert.DeserializeObject(data); var obj1 = stuff.AAPL; var obj2 = stuff.AAPL.quote; var obj3 = stuff.AAPL.quote.symbol; }

标签: c# json parsing json.net mapping


【解决方案1】:

您的问题是您的类模型与 API 输出的 json 模式不匹配。输出不是股票列表,而是 StockName: Stock 的映射

您可以将其反序列化为 Dictionary&lt;string, Stock&gt; 而不是 Root,这样您就可以到达您需要的位置。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2021-08-16
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多