我的市场API服务停止了我用来将数据存入我的C#应用程序的调用。他们已经发布了批量报价"功能实际上可以节省我的应用程序中的大量工作。它以JSON格式返回数据。我使用Newtonsoft来解析我的旧API调用,它返回一个非常可预测的输出。但是,现在批量报价API一次性返回动态数量的股票,我无法破解语法。
JSON输出:
{
"Meta Data": {
"1. Information": "Batch Stock Market Quotes",
"2. Notes": "IEX Real-Time Price provided for free by IEX (https://iextrading.com/developer/).",
"3. Time Zone": "US/Eastern"
},
"Stock Quotes": [
{
"1. symbol": "MSFT",
"2. price": "96.1800",
"3. volume": "20087326",
"4. timestamp": "2018-03-09 13:53:07"
},
{
"1. symbol": "AMD",
"2. price": "11.6800",
"3. volume": "63025764",
"4. timestamp": "2018-03-09 13:53:08"
},
{
"1. symbol": "NVDA",
"2. price": "243.9600",
"3. volume": "8649187",
"4. timestamp": "2018-03-09 13:52:51"
}
]
}
所以"股票行情"数组是我每次都需要抓取的数据,数组中的元素数量取决于用户的输入。
到目前为止,我已尝试过:
dynamic obj = JsonConvert.DeserializeObject(rawJSON);
这似乎创建了一个带有2个孩子的通用对象。我需要第二个孩子的所有孩子," Stock Quotes"。该对象包含一个count方法,显示有多少子元素" Stock Quotes"具有。我只是不确定我需要用来抓取每个子元素的语法。目标是将每个子元素放入自定义类的对象字典中。
非常感谢任何帮助,谢谢!
注意:所有其他方法都失败了我可能会操纵包含" Stock Quotes"的方括号的字符串。孩子,然后解析那些,等等。快速而肮脏,它可能会起作用 - 但它必须是一种更优雅的方法,对吗?
答案 0 :(得分:1)
您可以通过为每个集创建类并使用[JsonProperty(PropertyName = "Field name")]
指定JSON数据中的字段名称来实现此目的
使用类而不是dynamic
的一个好处是可以获得Intellisense。
所以,你的DTO课程看起来像这样:
public class Data
{
[JsonProperty(PropertyName = "Meta Data")]
public Metadata Metadata { get; set; }
[JsonProperty(PropertyName = "Stock Quotes")]
public IList<StockQuote> StockQuotes { get; set; }
}
public class Metadata
{
[JsonProperty(PropertyName = "1. Information")]
public string Information { get; set; }
[JsonProperty(PropertyName = "2. Notes")]
public string Notes { get; set; }
[JsonProperty(PropertyName = "3. Time Zone")]
public string Timezone { get; set; }
}
public class StockQuote
{
[JsonProperty(PropertyName = "1. symbol")]
public string Symbol { get; set; }
[JsonProperty(PropertyName = "2. price")]
public string Price { get; set; }
[JsonProperty(PropertyName = "3. volume")]
public string Volume { get; set; }
[JsonProperty(PropertyName = "4. timestamp")]
public string Timestamp { get; set; }
}
然后你就是:
var data = JsonConvert.DeserializeObject<Data>(str);
答案 1 :(得分:0)
您可以将JObject转换为属性名称和值的字典。
//parse JSON and grab it's children.
var JSONobj = JObject.Parse(test).Children();
//use linq to turn into dictionary, array, or whatever suits your needs.
//turn into dictionary of property name and value
var dictionary = JSONobj
.Select(s => (s as JProperty))
.ToDictionary(u => u.Name, v => v.Value);
//access the children of Stock Qoutes
var accessDictionaryChildren = dictionary["Stock Quotes"].Children();
var listChildren = accessDictionaryChildren.Children().ToList();
顺便说一下:
var dictionary["Stock Quotes"]="{[
{
"1. symbol": "MSFT",
"2. price": "96.1800",
"3. volume": "20087326",
"4. timestamp": "2018-03-09 13:53:07"
},
{
"1. symbol": "AMD",
"2. price": "11.6800",
"3. volume": "63025764",
"4. timestamp": "2018-03-09 13:53:08"
},
{
"1. symbol": "NVDA",
"2. price": "243.9600",
"3. volume": "8649187",
"4. timestamp": "2018-03-09 13:52:51"
}
]}