using System; using System.Reflection; using System.Text.Json; namespace InABox.Core { public class CoreTableJsonConverter : CustomJsonConverter { public override void Write(Utf8JsonWriter writer, CoreTable value, JsonSerializerOptions options) { writer.WriteStartObject(); // Columns writer.WritePropertyName("Columns"); writer.WriteStartObject(); foreach (var column in value.Columns) writer.WriteString(column.ColumnName, column.DataType.EntityName()); writer.WriteEndObject(); // Rows writer.WritePropertyName("Rows"); writer.WriteStartArray(); foreach (var row in value.Rows) { writer.WriteStartArray(); foreach (var column in value.Columns) { WriteJson(writer, row[column.ColumnName]); } writer.WriteEndArray(); } writer.WriteEndArray(); writer.WriteEndObject(); } public override CoreTable? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.Null) return null; var result = new CoreTable(); ReadObject(ref reader, (ref Utf8JsonReader reader, string propertyName) => { if (propertyName == "Columns") { ReadObject(ref reader, (ref Utf8JsonReader reader, string name) => { var type = reader.GetString(); result.Columns.Add(new CoreColumn { ColumnName = name, DataType = CoreUtils.GetEntity(type ?? "") }); }); } else if (propertyName == "Rows") { ReadArray(ref reader, (ref Utf8JsonReader reader) => { var iCol = 0; var newRow = result.NewRow(); ReadArray(ref reader, (ref Utf8JsonReader reader) => { var col = result.Columns[iCol]; newRow[col.ColumnName] = CoreUtils.ChangeType(ReadJson(ref reader), col.DataType); iCol++; }); result.Rows.Add(newRow); }); } else { reader.Skip(); } }); return result; } public override bool CanConvert(Type objectType) { return typeof(CoreTable).IsAssignableFrom(objectType); } } }