/// <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); } } }
/// <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); } } }