CoreTableJsonConverter.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. if (value == null)
  11. {
  12. writer.WriteNullValue();
  13. return;
  14. }
  15. writer.WriteStartObject();
  16. // Columns
  17. writer.WritePropertyName("Columns");
  18. writer.WriteStartObject();
  19. foreach (var column in value.Columns)
  20. writer.WriteString(column.ColumnName, column.DataType.EntityName());
  21. writer.WriteEndObject();
  22. // Rows
  23. writer.WritePropertyName("Rows");
  24. writer.WriteStartArray();
  25. foreach (var row in value.Rows)
  26. {
  27. writer.WriteStartArray();
  28. foreach (var column in value.Columns)
  29. {
  30. WriteJson(writer, row[column.ColumnName]);
  31. }
  32. writer.WriteEndArray();
  33. }
  34. writer.WriteEndArray();
  35. writer.WriteEndObject();
  36. }
  37. public override CoreTable? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  38. {
  39. if (reader.TokenType == JsonTokenType.Null)
  40. return null;
  41. var result = new CoreTable();
  42. try
  43. {
  44. reader.Read();
  45. while(reader.TokenType != JsonTokenType.EndObject)
  46. {
  47. if (reader.TokenType == JsonTokenType.PropertyName)
  48. {
  49. var propertyName = reader.GetString();
  50. reader.Read(); // Move to property value
  51. if (propertyName == "Columns")
  52. {
  53. if(reader.TokenType != JsonTokenType.StartObject)
  54. {
  55. throw new SerialisationException($"Unexpected token type after \"Columns\": {reader.TokenType}");
  56. }
  57. reader.Read(); // Skip over StartObject
  58. while (reader.TokenType != JsonTokenType.EndObject)
  59. {
  60. string name = reader.GetString()!;
  61. reader.Read(); // Advance to the property value
  62. var type = reader.GetString();
  63. result.Columns.Add(new CoreColumn { ColumnName = name, DataType = CoreUtils.GetEntity(type ?? "") });
  64. reader.Read(); // Move to next token
  65. }
  66. reader.Read(); // Skip EndObject
  67. }
  68. else if (propertyName == "Rows")
  69. {
  70. if(reader.TokenType != JsonTokenType.StartArray)
  71. {
  72. throw new SerialisationException($"Unexpected token type after \"Rows\": {reader.TokenType}");
  73. }
  74. reader.Read(); // Skip StartArray
  75. while (reader.TokenType != JsonTokenType.EndArray)
  76. {
  77. if(reader.TokenType != JsonTokenType.StartArray)
  78. {
  79. throw new SerialisationException($"Unexpected token type: {reader.TokenType}");
  80. }
  81. reader.Read(); // Skip StartArray
  82. var iCol = 0;
  83. var newrow = result.NewRow();
  84. while (reader.TokenType != JsonTokenType.EndArray)
  85. {
  86. var col = result.Columns[iCol];
  87. newrow[col.ColumnName] = CoreUtils.ChangeType(ReadJson(reader), col.DataType);
  88. reader.Read();
  89. iCol++;
  90. }
  91. result.Rows.Add(newrow);
  92. reader.Read(); // Skip EndArray
  93. }
  94. reader.Read(); // Skip EndArray
  95. }
  96. }
  97. }
  98. }
  99. catch(SerialisationException e)
  100. {
  101. Logger.Send(LogType.Error, "", $"SerialisationException: {e.Message}");
  102. return null;
  103. }
  104. catch (Exception e)
  105. {
  106. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  107. }
  108. return result;
  109. }
  110. public override bool CanConvert(Type objectType)
  111. {
  112. return typeof(CoreTable).IsAssignableFrom(objectType);
  113. }
  114. }
  115. }