提问者:小点点

用动态元素名称反序列化JSON


我正在尝试反序列化一个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);

共2个答案

匿名用户

在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);