首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从TD Ameritrade反序列化JSON

从TD Ameritrade反序列化JSON
EN

Stack Overflow用户
提问于 2021-03-14 10:16:19
回答 2查看 125关注 0票数 2

我从TD Ameritrade的API中拉入报价数据,并生成以下JSON:

代码语言:javascript
复制
{
  "AAPL": {
    "52WkHigh": 145.09,
    "52WkLow": 53.1525,
    "askId": "P",
    "askPrice": 121.08,
    "askSize": 1700,
    "assetMainType": "EQUITY",
    "assetType": "EQUITY",
    "bidId": "P",
    "bidPrice": 121.06,
    "bidSize": 600,
    "bidTick": " ",
    "closePrice": 121.03,
    "cusip": "037833100",
    "delayed": "false",
    "description": "Apple Inc. - Common Stock",
    "digits": 4,
    "divAmount": 0.82,
    "divDate": "2021-02-05 00:00:00.000",
    "divYield": 0.68,
    "exchange": "q",
    "exchangeName": "NASD",
    "highPrice": 121.17,
    "lastId": "D",
    "lastPrice": 121.08,
    "lastSize": 200,
    "lowPrice": 119.16,
    "marginable": "true",
    "mark": 121.03,
    "markChangeInDouble": 0.0,
    "markPercentChangeInDouble": 0.0,
    "nAV": 0.0,
    "netChange": 0.05,
    "netPercentChangeInDouble": 0.0413,
    "openPrice": 120.4,
    "peRatio": 32.9702,
    "quoteTimeInLong": 1615597198023,
    "regularMarketLastPrice": 121.03,
    "regularMarketLastSize": 7,
    "regularMarketNetChange": 0.0,
    "regularMarketPercentChangeInDouble": 0.0,
    "regularMarketTradeTimeInLong": 1615582801729,
    "securityStatus": "Normal",
    "shortable": "true",
    "symbol": "AAPL",
    "totalVolume": 88105050,
    "tradeTimeInLong": 1615597198932,
    "volatility": 0.0085
  }
}

从JSON创建的类:

代码语言:javascript
复制
public class Quote
{
    public float _52WkHigh { get; set; }
    public float _52WkLow { get; set; }
    public string askId { get; set; }
    public float askPrice { get; set; }
    public int askSize { get; set; }
    public string assetMainType { get; set; }
    public string assetType { get; set; }
    public string bidId { get; set; }
    public float bidPrice { get; set; }
    public int bidSize { get; set; }
    public string bidTick { get; set; }
    public float closePrice { get; set; }
    public string cusip { get; set; }
    public string delayed { get; set; }
    public string description { get; set; }
    public int digits { get; set; }
    public float divAmount { get; set; }
    public string divDate { get; set; }
    public float divYield { get; set; }
    public string exchange { get; set; }
    public string exchangeName { get; set; }
    public float highPrice { get; set; }
    public string lastId { get; set; }
    public float lastPrice { get; set; }
    public int lastSize { get; set; }
    public float lowPrice { get; set; }
    public string marginable { get; set; }
    public float mark { get; set; }
    public float markChangeInDouble { get; set; }
    public float markPercentChangeInDouble { get; set; }
    public float nAV { get; set; }
    public float netChange { get; set; }
    public float netPercentChangeInDouble { get; set; }
    public float openPrice { get; set; }
    public float peRatio { get; set; }
    public long quoteTimeInLong { get; set; }
    public float regularMarketLastPrice { get; set; }
    public int regularMarketLastSize { get; set; }
    public float regularMarketNetChange { get; set; }
    public float regularMarketPercentChangeInDouble { get; set; }
    public long regularMarketTradeTimeInLong { get; set; }
    public string securityStatus { get; set; }
    public string shortable { get; set; }
    public string symbol { get; set; }
    public int totalVolume { get; set; }
    public long tradeTimeInLong { get; set; }
    public float volatility { get; set; }
}

我调用Python脚本来获取JSON数据,然后将其重定向到我的C#应用程序。但是,当我反序列化它时,没有数据填充:

代码语言:javascript
复制
    public void GetQuotes(string symbol)
    {
        var errors = "";
        var results = "";
        this.psi.Arguments = $"\"{this.script}\" -q {symbol}";
        Quote quote;

        using (var process = Process.Start(psi))
        {
            errors = process.StandardError.ReadToEnd();
            results = process.StandardOutput.ReadToEnd();
            Debug.Print(results);
            
            quote = JsonConvert.DeserializeObject<Quote>(results);
            
        }

        MessageBox.Show(quote.symbol);
    }

我已经能够相对一致地成功地反序列化JSON,但是我不明白为什么要从这个Json加载空白对象。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-14 10:38:57

您需要创建一个包含Quote对象的根对象。

代码语言:javascript
复制
public class RootObject 
{
  public Quote AAPL { get;set;}
}

并反序列化到这个,

代码语言:javascript
复制
var rootObject = JsonConvert.DeserializeObject<RootObject>(results);
Quote quote = rootObject.AAPL;

当您反序列化到Quote时,您将得到空值,因为原始json中没有与任何Quote属性匹配的属性。由于您的JSON包含1个属性(AAPL),并且它的值是Quote类型,因此您必须反序列化为RootObject。

根据您对变量键的观点,您应该反序列化到Dictionary<string, Quote>

代码语言:javascript
复制
var obj = JsonConvert.DeserializeObject<Dictionary<string, Quote>>(results);
Quote quote = obj.FirstOrDefault().Value;

您还可以列出所有键并使用foreach循环,但是如果您知道总是只有一个键,FirstOrDefault()也可以工作。

票数 4
EN

Stack Overflow用户

发布于 2021-03-14 10:50:22

感谢Jawad的快速提示。因为'AAPL‘是一个不断变化的键,所以我不得不将JSON反序列化为一个Dictionary<string, Quote>来填充数据:

代码语言:javascript
复制
    public void GetQuotes(string symbol)
    {
        var errors = "";
        var results = "";
        this.psi.Arguments = $"\"{this.script}\" -q {symbol}";
        Dictionary<string, Quote> quotes;

        using (var process = Process.Start(psi))
        {
            errors = process.StandardError.ReadToEnd();
            results = process.StandardOutput.ReadToEnd();
            Debug.Print(results);

            
            quotes = JsonConvert.DeserializeObject<Dictionary<string, Quote>>(results);
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66620477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档