CoreTableJsonConverter.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.Reflection;
  3. using System.Text.Json;
  4. namespace InABox.Core
  5. {
  6. public class CoreTableJsonConverter : CustomJsonConverter<CoreTable>
  7. {
  8. public override void Write(Utf8JsonWriter writer, CoreTable value, JsonSerializerOptions options)
  9. {
  10. writer.WriteStartObject();
  11. // Columns
  12. writer.WritePropertyName("Columns");
  13. writer.WriteStartObject();
  14. foreach (var column in value.Columns)
  15. writer.WriteString(column.ColumnName, column.DataType.EntityName());
  16. writer.WriteEndObject();
  17. // Rows
  18. writer.WritePropertyName("Rows");
  19. writer.WriteStartArray();
  20. foreach (var row in value.Rows)
  21. {
  22. writer.WriteStartArray();
  23. foreach (var column in value.Columns)
  24. {
  25. WriteJson(writer, row[column.ColumnName]);
  26. }
  27. writer.WriteEndArray();
  28. }
  29. writer.WriteEndArray();
  30. writer.WriteEndObject();
  31. }
  32. public override CoreTable? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  33. {
  34. if (reader.TokenType == JsonTokenType.Null)
  35. return null;
  36. var result = new CoreTable();
  37. ReadObject(ref reader, (ref Utf8JsonReader reader, string propertyName) =>
  38. {
  39. if (propertyName == "Columns")
  40. {
  41. ReadObject(ref reader, (ref Utf8JsonReader reader, string name) =>
  42. {
  43. var type = reader.GetString();
  44. result.Columns.Add(new CoreColumn { ColumnName = name, DataType = CoreUtils.GetEntity(type ?? "") });
  45. });
  46. }
  47. else if (propertyName == "Rows")
  48. {
  49. ReadArray(ref reader, (ref Utf8JsonReader reader) =>
  50. {
  51. var iCol = 0;
  52. var newRow = result.NewRow();
  53. ReadArray(ref reader, (ref Utf8JsonReader reader) =>
  54. {
  55. var col = result.Columns[iCol];
  56. newRow[col.ColumnName] = CoreUtils.ChangeType(ReadJson(ref reader), col.DataType);
  57. iCol++;
  58. });
  59. result.Rows.Add(newRow);
  60. });
  61. }
  62. else
  63. {
  64. reader.Skip();
  65. }
  66. });
  67. return result;
  68. }
  69. public override bool CanConvert(Type objectType)
  70. {
  71. return typeof(CoreTable).IsAssignableFrom(objectType);
  72. }
  73. }
  74. }