我正在尝试反序列化一个JSON文件,但是items数组中有一个标记正在改变,那么如何在类描述中指定这个标记,请参见下面的类描述。
当我反序列化时,我得到以下消息:GetRapidapidataForSymbols中的错误:无法将当前JSON对象(例如{“name”:“value”})反序列化为类型“System.Collections.Generic.List`1[MarketDataProvider.YahooHistory+RapidapiItem]”,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。
The JSON:
{
"meta": {
"currency": "EUR",
"symbol": "UZU.DE",
"exchangeName": "GER",
"instrumentType": "EQUITY",
"firstTradeDate": 911462400,
"regularMarketTime": 1604397503,
"gmtoffset": 3600,
"timezone": "CET",
"exchangeTimezoneName": "Europe/Berlin",
"regularMarketPrice": 50.2,
"chartPreviousClose": 51,
"priceHint": 2,
"dataGranularity": "1d",
"range": ""
},
"items": {
"1340002800": {
"date": "18-06-2012",
"open": 19.05,
"high": 19.05,
"low": 19.05,
"close": 19.05,
"adjclose": 16.09
},
"1340089200": {
"date": "19-06-2012",
"open": 19.04,
"high": 19.05,
"low": 19.04,
"close": 19.04,
"adjclose": 16.09
},
"1340175600": {
"date": "20-06-2012",
"open": 19.04,
"high": 19.04,
"low": 19.04,
"close": 19.04,
"adjclose": 16.09
},
"1340262000": {
"date": "21-06-2012",
"open": 19.05,
"high": 19.05,
"low": 19.05,
"close": 19.05,
"adjclose": 16.09
},
"1604397503": {
"date": "03-11-2020",
"open": 50.6,
"high": 50.6,
"low": 50.2,
"close": 50.2,
"adjclose": 50.2
}
},
"error": null
}
My classes:
public class Meta
{
public string currency { get; set; }
public string symbol { get; set; }
public string exchangeName { get; set; }
public string instrumentType { get; set; }
public long? firstTradeDate { get; set; }
public long? regularMarketTime { get; set; }
public int? gmtoffset { get; set; }
public string timezone { get; set; }
public string exchangeTimezoneName { get; set; }
public decimal? regularMarketPrice { get; set; }
public decimal? chartPreviousClose { get; set; }
public decimal? previousClose { get; set; }
public int? scale { get; set; }
public int? priceHint { get; set; }
public string dataGranularity { get; set; }
public string range { get; set; }
}
public class RapidAPIHistoryResponse
{
[XmlElement("meta")]
public Meta meta { get; set; }
[XmlElement("items")]
public List<RapidAPIItem> items { get; set; }
public object error { get; set; }
}
public class RapidAPIItem
{
string dateTag { get; set; }
public YahooPrice item { get; set; }
}
My code:
var client = new RestClient("https://yahoo-finance15.p.rapidapi.com/api/yahoo/hi/history/UZU.DE/1d);
var request = new RestRequest(Method.GET);
request.AddHeader("x-rapidapi-host", "yahoo-finance15.p.rapidapi.com");
request.AddHeader("x-rapidapi-key", StartParameters.RapidAPIKey);
IRestResponse response = client.Execute(request);
YahooHistory.RapidAPIHistoryResponse history = JsonConvert.DeserializeObject<YahooHistory.RapidAPIHistoryResponse>(response.Content);
在Json中有“项”:{。。。。}使用“{}”表示items是一个对象。但是您希望“items”是一个数组“[]”。所以您的Json应该更像
"items" : [{"1604397503": {
"date": "03-11-2020",
"open": 50.6,
"high": 50.6,
"low": 50.2,
"close": 50.2,
"adjclose": 50.2
}},{"1340262000": {
"date": "21-06-2012",
"open": 19.05,
"high": 19.05,
"low": 19.05,
"close": 19.05,
"adjclose": 16.09
},
}]
只要你尊重物品字典的钥匙:
public Dictionary<string, Item> Items { get; set; }
在示例中:
"items": {
"1340002800": {
//...
},
"1340089200": {
//...
},
1340002800和1340089200是C#类型字典的键,类似于:
Dictionary<string, T> myDictionary
所以您需要键是字符串,然后是自定义对象。
这也会让你用“列表”中的每一项做事情:
var myResult = yahooQuotes.Items.Where(w => w.Item.High - w.Item.Low > 5).Select(s => s.Key);