using System.Text.Json; using System.Text.Json.Serialization; namespace Toolkit.Foundation; public class DictionaryStringObjectJsonConverter : JsonConverter> { public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(Dictionary) || typeToConvert == typeof(Dictionary); public override Dictionary Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { Dictionary dictionary = []; if (reader.TokenType == JsonTokenType.StartObject) { while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndObject) { return dictionary; } if (reader.TokenType is JsonTokenType.PropertyName) { string? propertyName = reader.GetString(); if (!string.IsNullOrWhiteSpace(propertyName)) { reader.Read(); dictionary.Add(propertyName!, ExtractValue(ref reader, options)); } } } } return dictionary; } public override void Write(Utf8JsonWriter writer, Dictionary value, JsonSerializerOptions options) => JsonSerializer.Serialize(writer, (IDictionary)value, options); private object? ExtractValue(ref Utf8JsonReader reader, JsonSerializerOptions options) { switch (reader.TokenType) { case JsonTokenType.String: if (reader.TryGetDateTime(out var date)) { return date; } return reader.GetString(); case JsonTokenType.False: return false; case JsonTokenType.True: return true; case JsonTokenType.Null: return null; case JsonTokenType.Number: if (reader.TryGetInt64(out var result)) { return result; } return reader.GetDecimal(); case JsonTokenType.StartObject: return Read(ref reader, null!, options); case JsonTokenType.StartArray: List list = []; while (reader.Read() && reader.TokenType != JsonTokenType.EndArray) { list.Add(ExtractValue(ref reader, options)); } return list; default: return default; } } }