DynamicJsonConverter.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Dynamic;
  4. using System.Text.Json;
  5. using System.Text.Json.Serialization;
  6. namespace DownloadImagesTool
  7. {
  8. /// <summary>
  9. /// Temp Dynamic Converter
  10. /// </summary>
  11. public class DynamicJsonConverter : JsonConverter<dynamic>
  12. {
  13. public override dynamic Read(ref Utf8JsonReader reader,
  14. Type typeToConvert,
  15. JsonSerializerOptions options)
  16. {
  17. if (reader.TokenType == JsonTokenType.True)
  18. {
  19. return true;
  20. }
  21. if (reader.TokenType == JsonTokenType.False)
  22. {
  23. return false;
  24. }
  25. if (reader.TokenType == JsonTokenType.Number)
  26. {
  27. if (reader.TryGetInt32(out int i))
  28. {
  29. return i;
  30. }
  31. if (reader.TryGetInt64(out long l))
  32. {
  33. return l;
  34. }
  35. if (reader.TryGetDecimal(out decimal d))
  36. {
  37. return d;
  38. }
  39. return reader.GetDouble();
  40. }
  41. if (reader.TokenType == JsonTokenType.String)
  42. {
  43. if (reader.TryGetDateTime(out DateTime datetime))
  44. {
  45. return datetime;
  46. }
  47. //if(reader.TryGetBytesFromBase64(out byte[] byteResult))
  48. //{
  49. // return byteResult;
  50. //}
  51. return reader.GetString();
  52. }
  53. if (reader.TokenType == JsonTokenType.StartObject)
  54. {
  55. using JsonDocument documentV = JsonDocument.ParseValue(ref reader);
  56. return ReadObject(documentV.RootElement);
  57. }
  58. // Use JsonElement as fallback.
  59. // Newtonsoft uses JArray or JObject.
  60. JsonDocument document = JsonDocument.ParseValue(ref reader);
  61. return document.RootElement.Clone();
  62. }
  63. private object ReadObject(JsonElement jsonElement)
  64. {
  65. IDictionary<string, object> expandoObject = new ExpandoObject();
  66. foreach (var obj in jsonElement.EnumerateObject())
  67. {
  68. var k = obj.Name;
  69. var value = ReadValue(obj.Value);
  70. expandoObject[k] = value;
  71. }
  72. return expandoObject;
  73. }
  74. private object ReadValue(JsonElement jsonElement)
  75. {
  76. object result = null;
  77. switch (jsonElement.ValueKind)
  78. {
  79. case JsonValueKind.Object:
  80. result = ReadObject(jsonElement);
  81. break;
  82. case JsonValueKind.Array:
  83. result = ReadList(jsonElement);
  84. break;
  85. case JsonValueKind.String:
  86. //TODO: Missing Datetime&Bytes Convert
  87. if(jsonElement.TryGetDateTime(out DateTime dtResult))
  88. {
  89. result = dtResult;
  90. break;
  91. }
  92. //if(jsonElement.TryGetBytesFromBase64(out byte[] byteResult))
  93. //{
  94. // result = byteResult;
  95. // break;
  96. //}
  97. result = jsonElement.GetString();
  98. break;
  99. case JsonValueKind.Number:
  100. //TODO: more num type
  101. if (jsonElement.TryGetInt32(out int i))
  102. {
  103. result = i;
  104. break;
  105. }
  106. if (jsonElement.TryGetInt64(out long l))
  107. {
  108. result = l;
  109. break;
  110. }
  111. if (jsonElement.TryGetDecimal(out decimal d))
  112. {
  113. result = d;
  114. break;
  115. }
  116. result = jsonElement.GetDouble();
  117. break;
  118. case JsonValueKind.True:
  119. result = true;
  120. break;
  121. case JsonValueKind.False:
  122. result = false;
  123. break;
  124. case JsonValueKind.Undefined:
  125. case JsonValueKind.Null:
  126. result = null;
  127. break;
  128. default:
  129. throw new ArgumentOutOfRangeException();
  130. }
  131. return result;
  132. }
  133. private object ReadList(JsonElement jsonElement)
  134. {
  135. IList<object> list = new List<object>();
  136. foreach (var item in jsonElement.EnumerateArray())
  137. {
  138. list.Add(ReadValue(item));
  139. }
  140. return list.Count == 0 ? null : list;
  141. }
  142. public override void Write(Utf8JsonWriter writer,
  143. object value,
  144. JsonSerializerOptions options)
  145. {
  146. // writer.WriteStringValue(value.ToString());
  147. }
  148. }
  149. }