internal void WriteValue(object v, ColumnMeta columnMeta, JsonWriter writer) { if (columnMeta is null) { throw new ArgumentNullException(nameof(columnMeta)); } writer.WritePropertyName("v"); if (v is null) { writer.WriteNull(); return; } object val = v; string?formattedVal; if (v is Cell cell) { val = cell.Value; formattedVal = cell.Formatted; } if (columnMeta.WriterAction != null) { columnMeta.WriterAction(writer); } else { switch (columnMeta.ColumnType) { case ColumnType.Number: var nullValType = Nullable.GetUnderlyingType(columnMeta.ValueType); if (nullValType != null && val is null) { writer.WriteNull(); } else { if (val is decimal dec) { writer.WriteValue(dec); } else if (val is double dou) { writer.WriteValue(dou); } else if (val is float flo) { writer.WriteValue(flo); } else if (val is int i) { writer.WriteValue(i); } else if (val is long l) { writer.WriteValue(l); } else { throw new NotSupportedException("Unsupported type " + v.GetType().FullName); } } break; case ColumnType.String: writer.WriteValue(val.ToString()); break; case ColumnType.Boolean: writer.WriteValue((bool)val); break; case ColumnType.Date: var d = (DateTime)val; writer.WriteValue(string.Format("Date({0}, {1}, {2})", d.Year, d.Month - 1, d.Day)); break; case ColumnType.Datetime: var dt = (DateTime)val; writer.WriteValue(string.Format("Date({0}, {1}, {2}, {3}, {4}, {5})", dt.Year, dt.Month - 1, dt.Day, dt.Hour, dt.Minute, dt.Second)); break; case ColumnType.Timeofday: var tod = val is DateTime time ? time.TimeOfDay : (TimeSpan)val; writer.WriteStartArray(); writer.WriteValue(tod.Hours); writer.WriteValue(tod.Minutes); writer.WriteValue(tod.Seconds); writer.WriteEndArray(); //writer.WriteRaw( string.Format("[{0}, {1}, {2}]", tod.Hours, tod.Minutes, tod.Seconds)); break; default: throw new Exception($"Columntype '{columnMeta.ColumnType}' not supported"); } } }