Пример #1
0
        /// <summary>
        /// Take JSON reader as input and output collection of items
        /// </summary>
        private IEnumerable <Models.Shared.DataItem> GetDataItems(JsonTextReader reader)
        {
            var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            List <string> headerTokens  = new List <string>();
            List <string> valueTokens   = new List <string>();
            bool          headerWritten = false;

            while (reader.Read())
            {
                if (reader.TokenType == JsonToken.PropertyName)
                {
                    if (headerWritten)
                    {
                        continue;
                    }

                    headerTokens.Add(reader.Value.ToString());
                }
                else if (
                    reader.TokenType == JsonToken.Boolean ||
                    reader.TokenType == JsonToken.Date ||
                    reader.TokenType == JsonToken.Float ||
                    reader.TokenType == JsonToken.Integer ||
                    reader.TokenType == JsonToken.String)
                {
                    valueTokens.Add(reader.Value.ToString());
                }
                else if (
                    reader.TokenType == JsonToken.Null)
                {
                    valueTokens.Add("");
                }
                else if (reader.TokenType == JsonToken.StartObject)
                {
                    headerTokens.Clear();
                    valueTokens.Clear();
                }
                else if (reader.TokenType == JsonToken.EndObject)
                {
                    if (!headerWritten)
                    {
                        headerWritten = true;
                    }

                    var newItem = new Models.Shared.DataItem()
                    {
                        // TODO: tryparse... log?
                        line_id      = int.Parse(valueTokens[0]),
                        service_id   = int.Parse(valueTokens[1]),
                        analytic_id  = int.Parse(valueTokens[2]),
                        business_id  = int.Parse(valueTokens[3]),
                        name         = valueTokens[4],
                        queue_id     = int.Parse(valueTokens[5]),
                        verification = valueTokens[6],
                        serviced     = !String.IsNullOrEmpty(valueTokens[7]) ? (DateTime?)epoch.AddSeconds(int.Parse(valueTokens[7])) : null,
                        called       = !String.IsNullOrEmpty(valueTokens[8]) ? (DateTime?)epoch.AddSeconds(int.Parse(valueTokens[8])) : null,
                        entered      = !String.IsNullOrEmpty(valueTokens[9]) ? (DateTime?)epoch.AddSeconds(int.Parse(valueTokens[9])) : null
                    };

                    newItem.wait_time    = (newItem.called.HasValue && newItem.entered.HasValue) ? newItem.called.Value - newItem.entered.Value : TimeSpan.Zero;
                    newItem.service_time = (newItem.serviced.HasValue && newItem.called.HasValue) ? newItem.serviced.Value - newItem.called.Value : TimeSpan.Zero;

                    yield return(newItem);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Take JSON reader as input and output collection of items
        /// </summary>
        private static IEnumerable <Models.Shared.DataItem> ReadDataItems(JsonTextReader reader)
        {
            int      triedInt = 0;
            string   propName = null;
            DateTime epoch    = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            Models.Shared.DataItem dataItem = null;

            while (reader.Read())
            {
                if (reader.TokenType == JsonToken.StartObject)
                {
                    dataItem = new Models.Shared.DataItem();
                }
                else if (reader.TokenType == JsonToken.PropertyName)
                {
                    propName = reader.Value.ToString();
                }
                else if (
                    reader.TokenType == JsonToken.Boolean ||
                    reader.TokenType == JsonToken.Date ||
                    reader.TokenType == JsonToken.Float ||
                    reader.TokenType == JsonToken.Integer ||
                    reader.TokenType == JsonToken.String ||
                    reader.TokenType == JsonToken.Null)
                {
                    // Any nulls won't be explicitly written as null, just proceed
                    if (reader.TokenType == JsonToken.Null)
                    {
                        continue;
                    }

                    var val = reader.Value;
                    switch (propName)
                    {
                    case "line_id":
                        if (!int.TryParse(val.ToString(), out triedInt))
                        {
                            log.ErrorFormat("Can't cast line_id='{0}' to int", val);
                        }
                        dataItem.LineId = triedInt;
                        break;

                    case "service_id":
                        if (!int.TryParse(val.ToString(), out triedInt))
                        {
                            log.ErrorFormat("Can't cast service_id='{0}' to int", val);
                        }
                        dataItem.ServiceId = triedInt;
                        break;

                    case "analytic_id":
                        if (!int.TryParse(val.ToString(), out triedInt))
                        {
                            log.ErrorFormat("Can't cast analytic_id='{0}' to int", val);
                        }
                        dataItem.AnalyticId = triedInt;
                        break;

                    case "called_by":
                        dataItem.CalledByName = val.ToString();
                        break;

                    case "serviced":
                        if (!int.TryParse(val.ToString(), out triedInt))
                        {
                            log.ErrorFormat("Can't cast serviced='{0}' to int", val);
                        }
                        dataItem.Serviced = epoch.AddSeconds(triedInt);
                        break;

                    case "serviced_by":
                        dataItem.ServicedByName = val.ToString();
                        break;

                    case "business_id":
                        if (!int.TryParse(val.ToString(), out triedInt))
                        {
                            log.ErrorFormat("Can't cast business_id='{0}' to int", val);
                        }
                        dataItem.BusinessId = triedInt;
                        break;

                    case "name":
                        dataItem.Name = val.ToString();
                        break;

                    case "queue_id":
                        if (!int.TryParse(val.ToString(), out triedInt))
                        {
                            log.ErrorFormat("Can't cast queue_id='{0}' to int", val);
                        }
                        dataItem.QueueId = triedInt;
                        break;

                    case "verification":
                        if (!int.TryParse(val.ToString(), out triedInt))
                        {
                            log.ErrorFormat("Can't cast verification='{0}' to int", val);
                        }
                        dataItem.Verification = triedInt;
                        break;

                    case "called":
                        if (!int.TryParse(val.ToString(), out triedInt))
                        {
                            log.ErrorFormat("Can't cast called='{0}' to int", val);
                        }
                        dataItem.Called = epoch.AddSeconds(triedInt);
                        break;

                    case "entered":
                        if (!int.TryParse(val.ToString(), out triedInt))
                        {
                            log.ErrorFormat("Can't cast entered='{0}' to int", val);
                        }
                        dataItem.Entered = epoch.AddSeconds(triedInt);
                        break;
                    }
                }
                else if (reader.TokenType == JsonToken.EndObject)
                {
                    yield return(dataItem);
                }
            }
        }