JsonModelConverter
A generic converter which allows  JsonSerializer to be able to write and read any models that implement  IJsonModel<T>.
            
                using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace System.ClientModel.Primitives
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(new byte[] {
        0,
        1,
        1
    })]
    [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The constructors of the type being deserialized are dynamically accessed and may be trimmed.")]
    public class JsonModelConverter : JsonConverter<IJsonModel<object>>
    {
        private ModelReaderWriterOptions _options { get; }
        public JsonModelConverter()
            : this(ModelReaderWriterOptions.Json)
        {
        }
        public JsonModelConverter(ModelReaderWriterOptions options)
        {
            _options = options;
        }
        public override bool CanConvert(Type typeToConvert)
        {
            return !Attribute.IsDefined(typeToConvert, typeof(JsonConverterAttribute));
        }
        public override IJsonModel<object> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            IJsonModel<object> obj = ModelReaderWriter.GetObjectInstance(typeToConvert) as IJsonModel<object>;
            if (obj == null)
                throw new InvalidOperationException("Either " + typeToConvert.Name + " or the PersistableModelProxyAttribute defined needs to implement IJsonModel.");
            return (IJsonModel<object>)obj.Create(ref reader, _options);
        }
        public override void Write(Utf8JsonWriter writer, IJsonModel<object> value, JsonSerializerOptions options)
        {
            value.Write(writer, _options);
        }
    }
}