protected StockData RequestData(JObject json, string timeSeriesKey)
        {
            bool containAllKeys = json.ContainsKey(META_DATA) && json.ContainsKey(timeSeriesKey);

            if (!containAllKeys)
            {
                log.WarnFormat("{0} or {1} keys are missing in the resulting JSON", META_DATA, timeSeriesKey);
                return(null);
            }

            var metaData   = (JObject)json.GetValue(META_DATA);
            var timeSeries = json.GetValue(timeSeriesKey);

            string symbol = GetValue(metaData, SYMBOL_KEY);

            if (string.IsNullOrEmpty(symbol))
            {
                log.WarnFormat("Missing symbol (key is {0})", SYMBOL_KEY);
                return(null);
            }

            StockData stockData = new StockData(symbol);

            foreach (var data in timeSeries.Children <JProperty>())
            {
                if (!(data.Value is JObject))
                {
                    continue;
                }
                JObject jdata = (JObject)(data.Value);

                try
                {
                    DateTime dateTime = DateTime.ParseExact(data.Name, AV_DATE_FORMAT, CultureInfo.InvariantCulture);

                    var open   = GetDoubleValue(jdata, OPEN_KEY);
                    var high   = GetDoubleValue(jdata, HIGH_KEY);
                    var low    = GetDoubleValue(jdata, LOW_KEY);
                    var close  = GetDoubleValue(jdata, CLOSE_KEY);
                    var volume = GetLongValue(jdata, VOLUME_KEY);

                    StockDataItem dataItem = new StockDataItem(dateTime)
                    {
                        Open   = open,
                        High   = high,
                        Low    = low,
                        Close  = close,
                        Volume = volume
                    };

                    stockData.AddDataItem(dataItem);
                }
                catch (Exception e)
                {
                    log.ErrorFormat("Exception when parsing json data {0}", e.StackTrace);
                }
            } // end foreach
            return(stockData);
        }