JsonTypeConverter.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using Newtonsoft.Json.Linq;
  2. using Newtonsoft.Json;
  3. namespace AipGateway.API.Domain.Common.Utilities
  4. {
  5. public class JsonTypeConverter<TModel> : JsonConverter
  6. {
  7. public override bool CanConvert(Type objectType)
  8. {
  9. return objectType == typeof(TModel);
  10. }
  11. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  12. {
  13. var result = default(TModel);
  14. switch (reader.TokenType)
  15. {
  16. case JsonToken.Integer:
  17. case JsonToken.Float:
  18. case JsonToken.String:
  19. case JsonToken.Boolean:
  20. case JsonToken.Date:
  21. result = (TModel)Convert.ChangeType(reader.Value, JsonTypeConverter<TModel>.GetUnderlyingType());
  22. break;
  23. case JsonToken.StartObject:
  24. JsonTypeConverter<TModel>.GetObject(reader, out result);
  25. break;
  26. }
  27. return result;
  28. }
  29. private static void GetObject(JsonReader reader, out TModel result)
  30. {
  31. var tags = JObject.Load(reader);
  32. result = tags != null && tags.Count > 0
  33. ? (TModel)Convert.ChangeType((string)tags[0], JsonTypeConverter<TModel>.GetUnderlyingType())
  34. : default;
  35. }
  36. private static Type GetUnderlyingType()
  37. {
  38. var type = typeof(TModel);
  39. return Nullable.GetUnderlyingType(type) ?? type;
  40. }
  41. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  42. {
  43. throw new NotImplementedException();
  44. }
  45. }
  46. }