【发布时间】:2020-11-03 15:02:53
【问题描述】:
我有一个我正在尝试反序列化的 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);
【问题讨论】:
-
您可以将
Dictionary<string, YahooPrice>用于items,如How can I parse a JSON string that would cause illegal C# identifiers? 或Create a strongly typed c# object from json object with ID as the name 或Parsing JSON Object with variable properties into strongly typed object 所示。 (您没有显示YahooPrice,但我认为它具有属性date、open、high、low、close和adjclose。)事实上,我认为这是重复的,同意? -
是的,好的旧字典完成了这项工作,谢谢!我的课程最终是这样的: public class RapidAPIHistoryResponse { [XmlElement("meta")] public Meta meta { get;放; } [XmlElement("items")] //公共项目 items { get;放; } 公共字典 项目 { 获取;放; } 公共对象错误 { 获取;放; } }
标签: c# json serialization