CoreTableJsonConverter.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Reflection;
  8. using Newtonsoft.Json;
  9. using Newtonsoft.Json.Linq;
  10. namespace InABox.Core
  11. {
  12. public class CoreTableJsonConverter : JsonConverter
  13. {
  14. public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
  15. {
  16. if(!(value is CoreTable table))
  17. {
  18. writer.WriteNull();
  19. return;
  20. }
  21. writer.WriteStartObject();
  22. writer.WritePropertyName("Columns");
  23. var cols = new Dictionary<string, string>();
  24. foreach (var column in table.Columns)
  25. cols[column.ColumnName] = column.DataType.EntityName();
  26. serializer.Serialize(writer, cols);
  27. //writer.WriteEndObject();
  28. //writer.WriteStartObject();
  29. writer.WritePropertyName("Rows");
  30. writer.WriteStartArray();
  31. var size = 0;
  32. foreach (var row in table.Rows)
  33. //Console.WriteLine("- Serializing Row #"+row.Index.ToString());
  34. try
  35. {
  36. writer.WriteStartArray();
  37. foreach (var col in table.Columns)
  38. {
  39. var val = row[col.ColumnName];
  40. if (val != null) size += val.ToString().Length;
  41. //Console.WriteLine(String.Format("Serializing Row #{0} Column [{1}] Length={2}", row.Index.ToString(), col.ColumnName, val.ToString().Length));
  42. if (col.DataType.IsArray && val != null)
  43. {
  44. writer.WriteStartArray();
  45. foreach (var val1 in (Array)val)
  46. writer.WriteValue(val1);
  47. writer.WriteEndArray();
  48. }
  49. else if (col.DataType.GetInterfaces().Contains(typeof(IPackableList)))
  50. {
  51. writer.WriteStartArray();
  52. foreach (var val1 in (IList)val)
  53. writer.WriteValue(val1);
  54. writer.WriteEndArray();
  55. }
  56. else
  57. {
  58. writer.WriteValue(val ?? CoreUtils.GetDefault(col.DataType));
  59. }
  60. }
  61. writer.WriteEndArray();
  62. //Console.WriteLine(String.Format("[{0:D8}] Serializing Row #{1}", size, row.Index.ToString()));
  63. }
  64. catch (Exception e)
  65. {
  66. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  67. }
  68. writer.WriteEndArray();
  69. writer.WriteEndObject();
  70. }
  71. public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
  72. {
  73. if (reader.TokenType == JsonToken.Null)
  74. return null;
  75. var result = new CoreTable();
  76. try
  77. {
  78. var json = JObject.Load(reader);
  79. if (json.TryGetValue("Columns", out var columns))
  80. {
  81. foreach (JProperty column in columns.Children())
  82. {
  83. var name = column.Name;
  84. var type = column.Value.ToObject<string>();
  85. result.Columns.Add(new CoreColumn { ColumnName = name, DataType = CoreUtils.GetEntity(type ?? "") });
  86. }
  87. }
  88. if (json.TryGetValue("Rows", out var rows))
  89. {
  90. foreach (JArray row in rows.Children())
  91. if (row.Children().ToArray().Length == result.Columns.Count)
  92. {
  93. var newrow = result.NewRow();
  94. var iCol = 0;
  95. foreach (var cell in row.Children())
  96. {
  97. var column = result.Columns[iCol];
  98. try
  99. {
  100. if (column.DataType.IsArray)
  101. {
  102. newrow[column.ColumnName] = cell.ToObject(column.DataType);
  103. }
  104. else if (column.DataType.GetInterfaces().Contains(typeof(IPackableList)))
  105. {
  106. }
  107. else
  108. {
  109. newrow[column.ColumnName] = cell.ToObject(column.DataType);
  110. }
  111. }
  112. catch (Exception e)
  113. {
  114. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  115. }
  116. iCol++;
  117. }
  118. result.Rows.Add(newrow);
  119. }
  120. }
  121. }
  122. catch (Exception e)
  123. {
  124. Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
  125. }
  126. return result;
  127. }
  128. public override bool CanConvert(Type objectType)
  129. {
  130. return typeof(CoreTable).GetTypeInfo().IsAssignableFrom(objectType);
  131. }
  132. }
  133. }