using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; using JetBrains.Annotations; namespace StabilityMatrix.Core.Converters.Json; /// /// Json converter for types that serialize to string by `ToString()` and /// can be created by `Activator.CreateInstance(Type, string)` /// Types implementing will be formatted with /// [PublicAPI] public class StringJsonConverter< [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T > : JsonConverter { /// public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.String) { throw new JsonException(); } var value = reader.GetString(); if (value is null) { return default; } return (T?)Activator.CreateInstance(typeToConvert, value); } /// public override T ReadAsPropertyName( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options ) { if (reader.TokenType != JsonTokenType.String) { throw new JsonException(); } var value = reader.GetString(); if (value is null) { throw new JsonException("Property name cannot be null"); } return (T?)Activator.CreateInstance(typeToConvert, value) ?? throw new JsonException("Property name cannot be null"); } /// public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options) { if (value is null) { writer.WriteNullValue(); return; } if (value is IFormattable formattable) { writer.WriteStringValue(formattable.ToString(null, CultureInfo.InvariantCulture)); } else { writer.WriteStringValue(value.ToString()); } } /// public override void WriteAsPropertyName(Utf8JsonWriter writer, T value, JsonSerializerOptions options) { if (value is null) { throw new JsonException("Property name cannot be null"); } if (value is IFormattable formattable) { writer.WriteStringValue(formattable.ToString(null, CultureInfo.InvariantCulture)); } else { writer.WriteStringValue(value.ToString()); } } }