将不可预测的日期作为标题反序列化Json响应

cotxawn7  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(95)

我正在以这种格式下载股票定价数据:
{“Meta数据”:{“1.信息”:“日内(5分钟)开盘,高,低,收盘价格和成交量”,“2.符号”:“IBM”,“3.上次刷新”:“2023-08-01 19:55:00”,“4.间隔”:“5分钟”,“5。输出大小”:“紧凑”,“6.时区”:“美国/东部”},“时间序列(5分钟)”:2023-08-01 19:55:00 {“1. open”:“142.8100”,“2.高”:“143.1000”,“3.低”:“142.8100”,“4. close”:“142.8100”,“5.卷”:“230”},“2023-08-01 19:45:00”:{“1. open”:“143.0000”,“2.高”:“143.0000”,“3.低”:“143.0000”,“4. close”:“143.0000”,“5.卷”:“50”},.......}
我想用C#反序列化。
Meta数据的结构是可预测的,这一部分正在工作。
但日期是不可预测的,我不知道响应的确切日期,每个日期都有五个潜在的变量。
因此,我无法使用确切的日期来构造JsonProperty项,那么我如何才能像这样反序列化数据呢?
我的尝试:

public class json_price
{

    [JsonProperty("Meta Data")]
    public headers Headers { get; set; }

    public class headers
    {
        [JsonProperty("1. Information")]
        public string s1 { get; set; }
        [JsonProperty("2. Symbol")]
        public string s2 { get; set; }
        [JsonProperty("3. Last Refreshed")]
        public string s3 { get; set; }
        [JsonProperty("4. Interval")]
        public string s4 { get; set; }
        [JsonProperty("5. Output Size")]
        public string s5 { get; set; }
        [JsonProperty("6. Time Zone")]
        public string s6 { get; set; }
    }

    [JsonProperty("Time Series 5min")]
    public priceheader ph { get; set; }

    // [JsonProperty("??????")] unknown date so can't refer to JsonProperty??
    public class priceheader
    {
        public datepricing[] dp { get; set; }
    }
             
    public class datepricing
    {

        [JsonProperty("1. open")]
        public long O { get; set; }
        [JsonProperty("2. high")]
        public long H { get; set; }
        [JsonProperty("3. low")]
        public long L { get; set; }
        [JsonProperty("4. close")]
        public long C { get; set; }
        [JsonProperty("5. volume")]
        public long V { get; set; }

    }

}

字符串
这会产生一个正确填充的Headers对象,但当我尝试反序列化时,会产生一个空的“ph”对象:

json_price results = JsonConvert.DeserializeObject<json_price>(output);


谢谢你,谢谢

sg2wtvxw

sg2wtvxw1#

如果您修复了datepringing属性的类型,则使用字典是有效的

json_price results = JsonConvert.DeserializeObject<json_price>(json);

public class json_price
{
    [JsonProperty("Meta Data")]
    public headers Headers { get; set; }

    [JsonProperty("Time Series (5min)")]
    public Dictionary<string, datepricing> ph { get; set; }
}
public class datepricing
{
    [JsonProperty("1. open")]
    public double O { get; set; }
    [JsonProperty("2. high")]
    public double H { get; set; }
    [JsonProperty("3. low")]
    public double L { get; set; }
    [JsonProperty("4. close")]
    public double C { get; set; }
    [JsonProperty("5. volume")]
    public long V { get; set; }
}

字符串
但我不喜欢将DateTime属性作为Dictionary键,我更喜欢使用List

var jObj=JObject.Parse(json);
    
    json_price results = jObj.ToObject<json_price>();
    
    foreach (JProperty prop in ((JObject) jObj["Time Series (5min)"]).Properties())
    {
        var dp=prop.Value.ToObject<datepricing>();
        dp.pricingDate= DateTime.Parse(prop.Name);
        results.ph.Add(dp);
    }

public class json_price
{
    [JsonProperty("Meta Data")]
    public headers Headers { get; set; }

    public List<datepricing> ph { get; set; } = new();
}

public class datepricing
{
    public DateTime pricingDate { get; set; }

    // another properties
}

相关问题