DictionaryJsonConverter.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using System.Diagnostics.CodeAnalysis;
  2. using System.Text.Json;
  3. using System.Text.Json.Serialization;
  4. namespace Terminal.Gui.Configuration;
  5. [RequiresUnreferencedCode ("AOT")]
  6. internal class DictionaryJsonConverter<T> : JsonConverter<Dictionary<string, T>>
  7. {
  8. public override Dictionary<string, T> Read (
  9. ref Utf8JsonReader reader,
  10. Type typeToConvert,
  11. JsonSerializerOptions options
  12. )
  13. {
  14. if (reader.TokenType != JsonTokenType.StartArray)
  15. {
  16. throw new JsonException ($"Expected a JSON array (\"[ {{ ... }} ]\"), but got \"{reader.TokenType}\".");
  17. }
  18. // If the Json options indicate ignoring case, use the invariant culture ignore case comparer.
  19. Dictionary<string, T> dictionary = new (
  20. options.PropertyNameCaseInsensitive
  21. ? StringComparer.InvariantCultureIgnoreCase
  22. : StringComparer.InvariantCulture);
  23. while (reader.Read ())
  24. {
  25. if (reader.TokenType == JsonTokenType.StartObject)
  26. {
  27. reader.Read ();
  28. if (reader.TokenType == JsonTokenType.PropertyName)
  29. {
  30. string key = reader.GetString ();
  31. reader.Read ();
  32. object value = JsonSerializer.Deserialize (ref reader, typeof (T), ConfigurationManager.SerializerContext);
  33. dictionary.Add (key, (T)value);
  34. }
  35. }
  36. else if (reader.TokenType == JsonTokenType.EndArray)
  37. {
  38. break;
  39. }
  40. }
  41. return dictionary;
  42. }
  43. public override void Write (Utf8JsonWriter writer, Dictionary<string, T> value, JsonSerializerOptions options)
  44. {
  45. writer.WriteStartArray ();
  46. foreach (KeyValuePair<string, T> item in value)
  47. {
  48. writer.WriteStartObject ();
  49. //writer.WriteString (item.Key, item.Key);
  50. writer.WritePropertyName (item.Key);
  51. JsonSerializer.Serialize (writer, item.Value, typeof (T), ConfigurationManager.SerializerContext);
  52. writer.WriteEndObject ();
  53. }
  54. writer.WriteEndArray ();
  55. }
  56. }