DictionaryJsonConverter.cs 1.8 KB

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