FlexibleTypeConverter.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System.Text.Json;
  2. using System.Text.Json.Serialization;
  3. public class FlexibleTypeConverter<T> : JsonConverter<T>
  4. {
  5. public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  6. {
  7. // Type 'T'에 따라 각 JSON 토큰 타입에 맞춰서 변환 시도
  8. switch (reader.TokenType)
  9. {
  10. case JsonTokenType.String:
  11. var strValue = reader.GetString();
  12. if (typeof(T) == typeof(int) && int.TryParse(strValue, out var intValue))
  13. return (T)(object)intValue;
  14. if (typeof(T) == typeof(long) && long.TryParse(strValue, out var longValue))
  15. return (T)(object)longValue;
  16. if (typeof(T) == typeof(double) && double.TryParse(strValue, out var doubleValue))
  17. return (T)(object)doubleValue;
  18. if (typeof(T) == typeof(bool) && bool.TryParse(strValue, out var boolValue))
  19. return (T)(object)boolValue;
  20. if (typeof(T) == typeof(string))
  21. return (T)(object)strValue;
  22. break;
  23. case JsonTokenType.Number:
  24. if (typeof(T) == typeof(int))
  25. return (T)(object)reader.GetInt32();
  26. if (typeof(T) == typeof(long))
  27. return (T)(object)reader.GetInt64();
  28. if (typeof(T) == typeof(double))
  29. return (T)(object)reader.GetDouble();
  30. break;
  31. case JsonTokenType.True:
  32. case JsonTokenType.False:
  33. if (typeof(T) == typeof(bool))
  34. return (T)(object)reader.GetBoolean();
  35. break;
  36. case JsonTokenType.Null:
  37. if (typeToConvert.IsClass) return default;
  38. throw new JsonException($"Cannot convert null to type '{typeof(T)}'.");
  39. }
  40. throw new JsonException($"Unable to convert JSON token to type '{typeof(T)}'.");
  41. }
  42. public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
  43. {
  44. // Type 'T'에 따라 JSON 타입에 맞춰서 기록
  45. if (value == null)
  46. {
  47. writer.WriteNullValue();
  48. return;
  49. }
  50. switch (value)
  51. {
  52. case int intValue:
  53. writer.WriteNumberValue(intValue);
  54. break;
  55. case long longValue:
  56. writer.WriteNumberValue(longValue);
  57. break;
  58. case double doubleValue:
  59. writer.WriteNumberValue(doubleValue);
  60. break;
  61. case bool boolValue:
  62. writer.WriteBooleanValue(boolValue);
  63. break;
  64. case string stringValue:
  65. writer.WriteStringValue(stringValue);
  66. break;
  67. default:
  68. throw new JsonException($"Unsupported type '{typeof(T)}'.");
  69. }
  70. }
  71. }