diff --git a/JsonSubTypes.Aot.Generated/GoldenMaster/JsonSubTypes.Aot/JsonSubTypes.Aot.JsonSubTypesGenerator/AnimalJsonSubTypesConverter.cs b/JsonSubTypes.Aot.Generated/GoldenMaster/JsonSubTypes.Aot/JsonSubTypes.Aot.JsonSubTypesGenerator/AnimalJsonSubTypesConverter.cs
index 43452e3..1d806e5 100644
--- a/JsonSubTypes.Aot.Generated/GoldenMaster/JsonSubTypes.Aot/JsonSubTypes.Aot.JsonSubTypesGenerator/AnimalJsonSubTypesConverter.cs
+++ b/JsonSubTypes.Aot.Generated/GoldenMaster/JsonSubTypes.Aot/JsonSubTypes.Aot.JsonSubTypesGenerator/AnimalJsonSubTypesConverter.cs
@@ -1,240 +1,71 @@
#nullable enable
using System;
-using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace JsonSubTypes.Aot.Generated
{
/// Generated by JsonSubTypes.Aot. Compiled converter for global::JsonSubTypes.Aot.Generated.TestDomain.Animal.
- public sealed class AnimalJsonSubTypesConverter : JsonConverter
+ public sealed class AnimalJsonSubTypesConverter : JsonSubTypesAotValueConverterBase
{
- public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Animal);
+ private const string DiscriminatorPropertyNameValue = "type";
+ protected override string DiscriminatorPropertyName => DiscriminatorPropertyNameValue;
- public override void Write(Utf8JsonWriter writer, global::JsonSubTypes.Aot.Generated.TestDomain.Animal value, JsonSerializerOptions options)
+ protected override System.Collections.Generic.Dictionary> DiscriminatorWriters { get; } = new System.Collections.Generic.Dictionary>
{
- if (value is null)
- {
- writer.WriteNullValue();
- return;
- }
- Type runtimeType = value.GetType();
- string payload;
- if (runtimeType == typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Animal))
- {
- if (IsRegistered(runtimeType))
- {
- payload = SerializeBasePayload((global::JsonSubTypes.Aot.Generated.TestDomain.Animal)value, options);
- }
- else
- {
- WriteBaseObject(writer, (global::JsonSubTypes.Aot.Generated.TestDomain.Animal)value, options);
- return;
- }
- }
- else if (IsRegistered(runtimeType))
- {
- payload = JsonSerializer.Serialize(value, options.GetTypeInfo(runtimeType));
- }
- else if (TryWriteNestedObject(writer, value, runtimeType, options))
- {
- return;
- }
- else if (TryWriteDynamic(writer, value, runtimeType, options))
+ [typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Cat)] = static (writer, options) => writer.WriteStringValue("cat"),
+ [typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Dog)] = static (writer, options) => writer.WriteNumberValue(2)
+ };
+
+ protected override Type SelectType(JsonElement root, JsonSerializerOptions options)
+ {
+ if (!TryGetValueInJson(root, DiscriminatorPropertyNameValue, options, out JsonElement discriminator))
{
- return;
+ return typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Animal);
}
- else
+ Type? staticType = ResolveStaticType(discriminator);
+ if (staticType != null)
{
- JsonSerializer.Serialize(writer, value, options.GetTypeInfo(runtimeType));
- return;
+ return staticType;
}
- using JsonDocument payloadDocument = JsonDocument.Parse(payload);
- string discriminatorName = "type";
- if (options.PropertyNamingPolicy != null)
+ if (TryGetDynamicType(discriminator, out Type? dynamicType))
{
- discriminatorName = options.PropertyNamingPolicy.ConvertName(discriminatorName);
+ return dynamicType!;
}
- writer.WriteStartObject();
- writer.WritePropertyName(discriminatorName);
- WriteDiscriminatorValue(writer, runtimeType, options);
- foreach (JsonProperty property in payloadDocument.RootElement.EnumerateObject())
+ if (CustomTypeNameResolver is not null)
{
- if (!property.NameEquals(discriminatorName))
+ Type? customType = CustomTypeNameResolver(GetDiscriminatorKey(discriminator));
+ if (customType != null)
{
- property.WriteTo(writer);
+ return customType;
}
}
- writer.WriteEndObject();
+ return typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Animal);
}
- public override global::JsonSubTypes.Aot.Generated.TestDomain.Animal? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ private static Type? ResolveStaticType(JsonElement discriminator)
{
- if (reader.TokenType == JsonTokenType.Null)
- {
- return null;
- }
- if (reader.TokenType != JsonTokenType.StartObject)
- {
- throw new JsonException("Unrecognized token: " + reader.TokenType);
- }
- using JsonDocument document = JsonDocument.ParseValue(ref reader);
- JsonElement root = document.RootElement;
- Type target = SelectType(root, options);
- if (target == typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Animal))
+ switch (discriminator.ValueKind)
{
- return DeserializeBase(root, options);
- }
- return (global::JsonSubTypes.Aot.Generated.TestDomain.Animal?)JsonSerializer.Deserialize(root.GetRawText(), options.GetTypeInfo(target));
- }
-
- private Type SelectType(JsonElement root, JsonSerializerOptions options)
- {
- if (TryGetValueInJson(root, "type", options, out JsonElement discriminator))
- {
-
- if (discriminator.ValueKind == JsonValueKind.String)
- {
- switch (discriminator.GetString())
- {
+ case JsonValueKind.String:
+ switch (discriminator.GetString())
+ {
case "cat": return typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Cat);
- }
- }
- if (discriminator.ValueKind == JsonValueKind.Number)
- {
- switch (discriminator.GetRawText())
- {
+ }
+ break;
+ case JsonValueKind.Number:
+ switch (discriminator.GetRawText())
+ {
case "2": return typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Dog);
- }
- }
- if (TryGetDynamicType(discriminator, out Type? dynamicType))
- {
- return dynamicType!;
- }
- if (CustomTypeNameResolver is not null)
- {
- Type? customType = CustomTypeNameResolver(GetDiscriminatorKey(discriminator));
- if (customType != null)
- {
- return customType;
+ }
+ break;
}
- }
- return typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Animal);
- }
- return typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Animal);
+ return null;
}
- private static readonly System.Collections.Generic.Dictionary> DiscriminatorWriters = new System.Collections.Generic.Dictionary>
- {
- [typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Cat)] = static (writer, options) => writer.WriteStringValue("cat"),
- [typeof(global::JsonSubTypes.Aot.Generated.TestDomain.Dog)] = static (writer, options) => writer.WriteNumberValue(2)
- };
-
- private static bool IsRegistered(Type runtimeType)
- {
- return DiscriminatorWriters.ContainsKey(runtimeType);
- }
-
- private static void WriteDiscriminatorValue(Utf8JsonWriter writer, Type runtimeType, JsonSerializerOptions options)
- {
- if (DiscriminatorWriters.TryGetValue(runtimeType, out System.Action? write))
- {
- write(writer, options);
- return;
- }
- throw new JsonException("Impossible to serialize type: " + runtimeType.FullName + " because there is no registered mapping for the discriminator property");
- }
-
- public readonly System.Collections.Concurrent.ConcurrentDictionary