【问题标题】:Unable to parse OHCLV data无法解析 OHCLV 数据
【发布时间】:2021-01-22 07:54:32
【问题描述】:

我无法将 OHCLV 数据从 JSON 解析为 List<Candle>。

Newtonsoft.Json.JsonSerializationException: '无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 'Models.Candle',因为该类型需要 JSON 对象(例如 {"name":"value" }) 正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组中反序列化。 路径“[0]”,第 1 行,位置 2。'

它只允许我用List<List<double>> 来做。我怎样才能做到这一点?

[[1604666100000,0.02585,0.02585,0.02577,0.02577,2346260.5],[1604666400000,0.02577,0.02577,0.02571,0.02572,3853038.7000000002],[1604666700000,0.02572,0.02573,0.02568,0.02573,2525735.5],[1604667000000,0.02573,0.02578,0.02573,0.02574,2519284.3999999999],[1604667300000,0.02575,0.02582,0.02574,0.02578,1463562.6000000001],[1604667600000,0.02578,0.02587,0.02577,0.02585,2074134.3]]

代码:

public class Candle
{
    public DateTime OpenTime { get; set; }
    public decimal High { get; set; }
    public decimal Low { get; set; }
    public decimal Open { get; set; }
    public decimal Close { get; set; }
    public decimal Volume { get; set; }
}

public static List<Candle> LoadCandles(string path)
{
    var basePath = AppDomain.CurrentDomain.BaseDirectory;
    var filePath = Path.Combine(basePath, path);

    if (!File.Exists(filePath))
        throw new FileNotFoundException($"The .json '{filePath}' file used to load the candles from was not found.");

    var data = File.ReadAllText(filePath);
    //var candles3 = JsonConvert.DeserializeObject<List<List<double>>>(data); // this one works

    var candles = JsonConvert.DeserializeObject<List<Candle>>(data);
    return candles;
}

【问题讨论】:

    标签: c# json deserialization cryptocurrency ohlcv


    【解决方案1】:

    低技术方法

    用法

    var input = "[[1604666100000,0.02585,0.02585,0.02577,0.02577,2346260.5],[1604666400000,0.02577,0.02577,0.02571,0.02572,3853038.7000000002],[1604666700000,0.02572,0.02573,0.02568,0.02573,2525735.5],[1604667000000,0.02573,0.02578,0.02573,0.02574,2519284.3999999999],[1604667300000,0.02575,0.02582,0.02574,0.02578,1463562.6000000001],[1604667600000,0.02578,0.02587,0.02577,0.02585,2074134.3]]";
    
    var results = JArray
       .Parse(input)
       .Select(x => new Candle(){ 
          OpenTime = DateTimeOffset.FromUnixTimeMilliseconds(x[0].Value<long>()).DateTime,
          Open = x[1].Value<decimal>(),
          High = x[2].Value<decimal>(),
          Low = x[3].Value<decimal>(),
          Close = x[4].Value<decimal>(),
          Volume = x[5].Value<decimal>()
       }).ToList();
            
    foreach(var item in results)
       Console.WriteLine($"Open : {item.Open}, High : {item.High}, Low : {item.Low}, Close : {item.Close}, Volume : {item.Volume}");
    

    输出

    Open : 0.02585, High : 0.02585, Low : 0.02577, Close : 0.02577, Volume : 2346260.5
    Open : 0.02577, High : 0.02577, Low : 0.02571, Close : 0.02572, Volume : 3853038.7
    Open : 0.02572, High : 0.02573, Low : 0.02568, Close : 0.02573, Volume : 2525735.5
    Open : 0.02573, High : 0.02578, Low : 0.02573, Close : 0.02574, Volume : 2519284.4
    Open : 0.02575, High : 0.02582, Low : 0.02574, Close : 0.02578, Volume : 1463562.6
    Open : 0.02578, High : 0.02587, Low : 0.02577, Close : 0.02585, Volume : 2074134.3
    

    【讨论】:

    • 感谢您的回答!开放时间呢?我从stackoverflow.com/questions/249760/… 尝试了 EpochTimeExtensions,但 System.ArgumentOutOfRangeException: '添加或减去的值导致无法表示的 DateTime
    • @nop 说实话,它不是我所知道的任何格式,那是什么时候是个谜。如果你让我知道我会尽力提供帮助,你可能需要阅读文档
    • 相同。上面的网站转换它,但不知道如何。 i.imgur.com/dr39Tsx.png
    • @nop 似乎以毫秒为单位。更新epoch.AddMilliseconds(unixTime);
    • 显然我读到最好使用DateTimeOffset.FromUnixTimeMilliseconds((long)x[0]).DateTime 作为OHLCV 的格式。但两者都有效!
    【解决方案2】:

    也许一个选择就足够了:

    var data = JsonConvert.DeserializeObject<List<List<decimal>>>(json);
    var candles = data.Select(d => new Candle {OpenTime = new DateTime((long)d[0]), High = d[1], ... }).ToList();
    

    如果你真的想直接对 Candle 进行反序列化,你可以使用自定义转换器:

    class Program
    {
        static void Main(string[] args)
        {
            var json = "[[1604666100000,0.02585,0.02585,0.02577,0.02577,2346260.5],[1604666400000,0.02577,0.02577,0.02571,0.02572,3853038.7000000002],[1604666700000,0.02572,0.02573,0.02568,0.02573,2525735.5],[1604667000000,0.02573,0.02578,0.02573,0.02574,2519284.3999999999],[1604667300000,0.02575,0.02582,0.02574,0.02578,1463562.6000000001],[1604667600000,0.02578,0.02587,0.02577,0.02585,2074134.3]]";
            var candles = JsonConvert.DeserializeObject<List<Candle>>(json);
        }
    }
    
    [JsonConverter(typeof(CandleConverter))]
    public class Candle
    {
        public DateTime OpenTime { get; set; }
        public decimal High { get; set; }
        public decimal Low { get; set; }
        public decimal Open { get; set; }
        public decimal Close { get; set; }
        public decimal Volume { get; set; }
    }
    
    public class CandleConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.StartArray)
            {
                var array = JArray.Load(reader);
                return new Candle {
                    OpenTime = new DateTime(array[0].Value<long>()),
                    High = array[1].Value<decimal>(),
                    Low = array[2].Value<decimal>(),
                    Open = array[2].Value<decimal>(),
                    Close = array[2].Value<decimal>(),
                    Volume = array[2].Value<decimal>()
                };
            }
            throw new NotImplementedException();
        }
    
        public override bool CanWrite
        {
            get { return false; }
        }
    
        public override bool CanConvert(Type objectType)
        {
            return false;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2019-02-24
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      相关资源
      最近更新 更多