12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- using System;
- using System.Reflection;
- using System.Text.Json;
- namespace InABox.Core
- {
- public class CoreTableJsonConverter : CustomJsonConverter<CoreTable>
- {
- 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);
- }
- }
- }
|