private void EnrichWithMetadata(JProperty metadataJson, TechIndicatorSeries timeSeries)
        {
            var metadatas = metadataJson.Children().Single();

            foreach (var metadataItem in metadatas)
            {
                var metadataProperty  = (JProperty)metadataItem;
                var metadataItemName  = metadataProperty.Name;
                var metadataItemValue = metadataProperty.Value.ToString();

                switch (metadataItemName)
                {
                case TechIndicatorJsonTokens.SymbolToken:
                    timeSeries.Symbol = metadataItemValue;
                    break;

                case TechIndicatorJsonTokens.IndicatorToken:
                    timeSeries.Indicator = metadataItemValue;
                    break;

                case TechIndicatorJsonTokens.IntervalToken:
                    timeSeries.Interval = GetInterval(metadataItemValue);
                    break;

                case TechIndicatorJsonTokens.LastRefreshedToken:
                    timeSeries.LastRefreshed = DateTime.Parse(metadataItemValue);
                    break;

                case TechIndicatorJsonTokens.TimePeriodToken:
                    timeSeries.TimePeriod = int.Parse(metadataItemValue, CultureInfo.InvariantCulture);
                    break;

                case TechIndicatorJsonTokens.TimeZoneToken:
                    timeSeries.TimeZone = metadataItemValue;
                    break;
                }
            }
        }
        public TechIndicatorSeries ParseTechIndicatorSeries(JObject jObject)
        {
            if (jObject == null)
            {
                throw new ArgumentNullException(nameof(jObject));
            }

            try
            {
                var properties = jObject.Children().Select(ch => (JProperty)ch).ToArray();

                var metadataJson   = properties.FirstOrDefault(p => p.Name == MetaDataJsonTokens.MetaDataHeader);
                var timeSeriesJson =
                    properties.FirstOrDefault(p => p.Name.Contains(TechIndicatorJsonTokens.TechIndicatorHeader));

                if (metadataJson == null || timeSeriesJson == null)
                {
                    throw new StocksParsingException("Unable to parse Technical Indicator json");
                }

                var result = new TechIndicatorSeries();

                EnrichWithMetadata(metadataJson, result);
                result.DataPoints = GetTechIndicatorDataPoints(timeSeriesJson);

                return(result);
            }
            catch (StocksParsingException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new StocksParsingException("Unable to parse data. See the inner exception for details", ex);
            }
        }