DictionaryJsonConverter.cs 1.4 KB

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